Я работаю над клиентом UDP для связи с сервером, на котором у меня нет контроля. Часть требования к общению с этим сервером заключается в том, что я должен предоставить номер порта UDP [как часть сообщения] для сервера для его ответа.Нужна помощь в получении моего клиентского приложения Java UDP
У меня есть несколько классов в моем приложении, которые требуют DatagramSocket, представляющим различные запросы на этот сервер, поэтому я создал статический класс:
package mypackage;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class DatagramSocketGrabber {
public DatagramSocketGrabber(){}
public static DatagramSocket getSocket() throws SocketException {
DatagramSocket newSocket = new DatagramSocket();
InetSocketAddress newSocketAddress = new InetSocketAddress(15346);
newSocket.bind(newSocketAddress);
return newSocket;
}
}
В моем основном() классе, я захватывая этот сокет соединение и использовать его на протяжении всей моей заявки:
package mypackage;
import java.net.DatagramSocket;
import java.net.SocketException;
public class MyApp {
public static void main(String[] args){
DatagramSocket mySocket = null;
try {
mySocket = DatagramSocketGrabber.getSocket();
} catch(SocketException se){
System.out.println(se);
}
DSClass01 class01 = new DSClass01(mySocket);
DSClass02 class02 = new DSClass02(mySocket);
DSClass03 class03 = new DSClass03(mySocket);
mySocket.close();
}
}
Однако всякий раз, когда я запускаю мое приложение, я всегда получаю ошибку:
java.net.SocketException: already bound
НУЖНО ЗНАТЬ:
UDP-сервер на моей машине (локальный), но это компилируется приложение, поэтому я не могу изучить его код. Да, это из надежного источника.
Нет проблем с брандмауэром или сетью, поскольку он представляет собой автономный компьютер со всем широким открытым доступом.
Прежде чем создать статический класс DatagramSocketGrabber, я создал новый DatagramSocket во всех своих классах сообщений, и сервер смог успешно получить мои сообщения.
Однако причина, по которой я создал статический класс, состоит в том, что я не получал никаких ответов, и я решил, что это связано с тем, что я не привязывал мой сокет к «фиксированному» порту приема. Чтобы сделать это и иметь возможность использовать этот связанный сокет во всех моих классах сообщений, я решил, что мне нужно создать класс создания DatagramSocket, чтобы иметь один связанный сокет, который я мог бы пройти.
Кажется, вы пытаетесь связать порт 15346 несколько раз – malinator