проблема с Java-сокетом - PullRequest
       15

проблема с Java-сокетом

1 голос
/ 13 февраля 2010

Я пытаюсь сделать простой клиент TCP и хост-чат в Java. Они оба работают в простых графических интерфейсах. После того, как я запускаю свой сервер, он ожидает подключения от клиента, а затем распечатывает сообщение в своей JtextArea. Сервер делает это успешно, все работает нормально до этого момента, теперь я отправляю некоторые данные клиенту, которые он должен распечатать на своем JtextArea, но клиент застревает с момента установления соединения, кнопка подключения остается нажатой, и она просто зависает.

здесь код кнопки подключения клиента, я думаю, что я делаю что-то не так

  private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {                                      
    serverName = t3.getText();
    serverPort = Integer.parseInt(t4.getText());
    try {

        tb.append("\nconnecting...>\n"+temp);
        connect2Server();
        temp = in.readLine();
        tb.append(temp);

    } catch (IOException ex) {
        tb.append(ex.toString());
        Logger.getLogger(DesktopApplication1View.class.getName()).log(Level.SEVERE, null, ex);
    }

}       

   private void connect2Server() throws IOException{
        try{
         skt = new Socket(serverName,serverPort);
            in = new BufferedReader(new
            InputStreamReader(skt.getInputStream()));
        }
        catch(UnknownHostException uh){
            tb.append(uh.toString());
        }
        catch(IOException io){
            tb.append(io.toString());
        }
    }

//vars
BufferedReader in;
Socket skt;

1 Ответ

3 голосов
/ 13 февраля 2010

Причина, по которой ваша кнопка подключения остается нажатой, заключается в том, что вы блокируете поток рисования. Взгляните на параллелизм в учебнике по Swing . Суть в том, что все события графического интерфейса в Swing публикуются в потоке рисования, и если вы хотите выполнить любую задачу блокировки (например, вызовы сервера) или любой другой длительный процесс, вы должны разбить ваш процесс на отдельные задачи. Все задачи, которые выполняют или запускают рисование GUI, должны выполняться через поток рисования. Долгосрочные задачи должны выполняться в фоновых потоках. SwingWorker - это одна конструкция, которую Java предоставляет для такого рода дизайна.

В настоящее время ваш метод jButton2MouseClicked выполняется в потоке рисования и не позволяет вашему приложению продолжать рисовать, включая размораживание кнопки подключения, до тех пор, пока не завершится вызов сервера.

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