Проблема с потоками в сокете Java - PullRequest
0 голосов
/ 18 февраля 2010

Я создаю 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, соответствующее этому клиенту, не печатается до тех пор, пока самый последний клиент не отключится, что делает сокет «свободным». Любые указатели на то, как я могу решить эту проблему и распечатать подсказки, как и когда любой из одновременно подключенных клиентов отключается, не дожидаясь, пока все они отключатся, будут очень полезны.

К вашему сведению, я моделирую вышеуказанную среду, используя несколько экземпляров Гипертерминала.

Приветствия

Ответы [ 2 ]

1 голос
/ 06 августа 2010
while (true) {
    //Socket connection = socket1.accept();

    thread.start();       
    thread1.start();
  }
}


catch (Exception e) {}

Не ловить и не глотать все исключения. Кроме того, если поток встречает необработанное исключение, он просто умрет. Вы не будете перехватывать исключения потоков в цикле while.
Вы не можете повторно использовать объекты потока. Когда метод run () завершится, вы не сможете снова вызвать start (). Вы должны создать новый поток (возможно, с тем же выполнением, если это имеет смысл). Вы также можете улучшить имена переменных, сделав их описательными.

0 голосов
/ 18 февраля 2010

Не выполнять сетевой код в потоке AWT, например, в методе actionPerformed ().Используйте отдельную тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...