JAVA - Socket.accept () замораживает пользовательский интерфейс - PullRequest
4 голосов
/ 26 марта 2012

Я пытаюсь создать многопоточное серверное / клиентское приложение с Java! этот код предназначен для метода listen () в классе пакета с именем Bsocket (iserver.core.socket):

 try {
     serverSocket = new ServerSocket(port);
 }catch(IOException e ){
     ui.log(e.toString());//*
 }
while (true){
    try{
        clienSocket = serverSocket.accept();
        ui.log("Incomming Connection.");//*
        new connectionHandler(clienSocket, ui);
    }catch(IOException e ){
        ui.log(e.toString());
    }
}

ui.log("Incomming Connection."); - это метод ниже основного класса Bgui (iserver.core.ui). Bgui - это jframe, который содержит текстовую область и что-то еще! проблема в том, что когда методы accept выполняются, ui.log не работает! что здесь не так?

Ответы [ 3 ]

7 голосов
/ 26 марта 2012

Вам потребуется запустить сервер в отдельном потоке, поскольку .accept является блокирующим вызовом.Возможно, вы захотите сделать что-то вроде этого:

(new Runnable() {
    @Override
    public void run()
    {
         try {
              serverSocket = new ServerSocket(port);
          }catch(IOException e ){
              ui.log(e.toString());//*
          }
         while (true){
             try{
                 clienSocket = serverSocket.accept();
                 ui.log("Incomming Connection.");//*
                 new connectionHandler(clienSocket, ui);
             }catch(IOException e ){
                 ui.log(e.toString());
             }
         }
    }
}).start();

ПРИМЕЧАНИЕ. Этот код не тестируется, но он должен дать вам представление о том, что вам нужно делать.

6 голосов
/ 26 марта 2012

Socket.accept() блокируется, пока не будет получено входящее соединение (см. Документацию). Вы не должны делать какие-либо блокирующие вызовы из вашего потока пользовательского интерфейса - иначе это будет ... вы знаете ... блокировать!

4 голосов
/ 26 марта 2012

Вам необходимо отделить потоки пользовательского интерфейса от собственных потоков сетевых служб.accept () блокирует (очевидно) и замораживает ваше приложение до тех пор, пока вы не получите нового клиента, и снова зависает в ожидании большего количества клиентов.

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