Я создаю приложение Java, которое одновременно прослушивает два порта и также способно многопоточно. Как я делаю это следующим образом. У меня очень простой графический интерфейс в PortApp.java, который принимает 2 целых числа через 2 текстовых поля, а также имеет кнопку прослушивания. Поэтому, когда нажата кнопка прослушивания, выполняется следующий код.Проблема с резьбой сокета Java
jTextField1.disable();
jTextField2.disable();
int port = Integer.valueOf(jTextField1.getText());
int port1 =Integer.valueOf(jTextField2.getText());
int count = 0;
try{
foo(port,port1);
while (true) {
//Socket connection = socket1.accept();
thread.start();
thread1.start();
}
}
catch (Exception e) {}
И метод Foo() заключается в следующем
public void foo(int a, int b){ //function to get the port numbers as integers and to declare 2 sockets for the ports.
int port=a;
int port1=b;
int count=0;
try {
socket1 = new ServerSocket(port);
} catch (IOException ex) {
}
try {
socket2 = new ServerSocket(port1);
} catch (IOException ex) {
}
//System.out.println("MultipleSocketServer Initialized");
Runnable runnable = new MultipleSocketServer(socket1, ++count);
Runnable run = new MultipleSocketServer(socket2, ++count);
thread = new Thread(runnable);
thread1 = new Thread(run);
}
, где socket1 и socket2 случаи ServerSocket. Затем управление передается другому классу MultipleSocketServer, который заставляет работать другой бэкэнд после установления сокетов.
Прогон() класса MultipleSocketServer выглядит следующим образом
public void run() {
while(true){
try {
Socket incoming=connection.accept();
BufferedInputStream is = new BufferedInputStream(incoming.getInputStream());
int character;
while((character = is.read())!=-1) {
//DO SOMETHING
}
incoming.close();
SYstem.out.println("Client DC'ed");
//CONTINUE WITH OTHER EXECUTIONS
}
и конструктор MultipleSocketServer является
MultipleSocketServer(ServerSocket s, int i) {
this.connection = s;
this.ID = i;
}
Теперь выше код слушатель поддерживает несколько клиентов одновременно. И я подумал, что он будет и должен печатать сообщение «cient DC'ed», когда любой из клиентов «одновременно одновременно подключенных к одному порту» отключается, но это, похоже, не происходит, оно не распечатывает приглашение до тех пор, пока последний клиент подключен к этому экземпляру порта, и как только этот клиент отключится, он распечатает приглашения всех клиентов. В сущности, даже если какой-либо конкретный клиент отключается, сообщение propmt, соответствующее этому клиенту, не печатается до тех пор, пока последний клиент не отключится, тем самым сделав сокет «бесплатным». Любые указатели на то, как я могу разрешить это и распечатать подсказки, когда и когда любой из одновременно подключенных клиентов отключится, не дожидаясь их отключения, будет очень полезной.
FYI, я имитирую вышеуказанную среду, используя несколько экземпляров Hyperterminal.
CHEERS