Я создаю Java-приложение, которое одновременно прослушивает 2 порта и поддерживает многопоточность.
Как я делаю это следующим образом. У меня есть очень простой графический интерфейс в PortApp.java, который принимает 2 целых числа через 2 текстовых поля, а также имеет кнопку прослушивания. Поэтому при нажатии кнопки прослушивания выполняется следующий код.
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, который inturn выполняет работу другого бэкэнда после установления сокетов.
run () класса 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» всякий раз, когда любой из «множества одновременно подключенных к одному порту» клиентов отключается, но, похоже, этого не происходит, он не выводит подсказку до последний клиент подключается к этому экземпляру порта, и как только этот клиент отключается, он выводит сообщения-подсказки всех клиентов. Таким образом, по сути, даже если какой-либо конкретный клиент отключается, сообщение propmt, соответствующее этому клиенту, не печатается до тех пор, пока самый последний клиент не отключится, что делает сокет «свободным».
Любые указатели на то, как я могу решить эту проблему и распечатать подсказки, как и когда любой из одновременно подключенных клиентов отключается, не дожидаясь, пока все они отключатся, будут очень полезны.
К вашему сведению, я моделирую вышеуказанную среду, используя несколько экземпляров Гипертерминала.
Приветствия