Программа перестает отвечать на запросы ServerSocket.accept - Java - PullRequest
1 голос
/ 31 января 2010

Моя программа прослушивает только одно соединение один раз ... программа просто застревает в 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());

1 Ответ

2 голосов
/ 31 января 2010

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

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

...