Программа не отвечает на ServerSocket.accept - Java

Моя программа прослушивает только одно соединение один раз... программа просто застревает в clientSocket = serverSocket.accept(), если клиент не подключается. Я имею в виду, что я даже не могу прервать его, закрыв окно. Я не могу нажать ни одну из моих кнопок в кадре и т.д.

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

public void runServer() {
    try {
        serverSocket = new ServerSocket(PORT_NUMBER, 20);
        clientSocket = serverSocket.accept();
        taDisplay.append("Client connected!");
        lblPlayingTo.setText("Playing to: " + objective);

        socketIn = new DataInputStream(clientSocket.getInputStream());
        socketOut = new DataOutputStream(clientSocket.getOutputStream());

        socketOut.writeUTF(serverName);
        clientName = socketIn.readUTF();
        lblEastScore.setText(clientName + ": " + eastScore.getScore());  

    } catch (IOException e) {
        System.out.println(e);
        taDisplay.append("Could not listen on port: " + PORT_NUMBER + ".\n");
    }
}

Я удалил весь свой код, кроме этого (ниже), но все равно сталкиваюсь с той же проблемой «зависания».

    setTitle(title);
    setSize(sizeW, sizeH);
    setVisible(visibility);
    setResizable(resizability);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addKeyListener(new MyKeyAdapter());
    addMouseListener(new MyMouseAdapter());

    //Container
    c = getContentPane();
    c.setLayout(new BorderLayout());

person Dois    schedule 31.01.2010    source источник
comment
Где в вашем коде вы вызываете runServer?   -  person Ash    schedule 31.01.2010


Ответы (1)


Похоже, вы делаете свой serverSocket.accept() вызов в GUI Event Dispatch Thread (EDT). Swing полагается на EDT для рендеринга и обработки взаимодействия с пользователем — если вы делаете блокирующий вызов, например «принять», вы не увидите никаких обновлений в графическом интерфейсе.

Что вам нужно сделать, так это создать новый поток (или использовать «основной» поток приложения, который отличается от EDT), который сидит на приеме, ожидая подключения клиента. После подключения он может выполнять любую необходимую работу, но когда вы хотите обновить графический интерфейс, вам нужно обернуть код для обновления в Runnable и передать его в EDT через SwingUtilities.invokeLater.

person Ash    schedule 31.01.2010
comment
Спасибо, я понимаю, что вы имеете в виду. Я запускал его в другом потоке, и он работает. - person Dois; 31.01.2010