1

我的程序只监听一个连接...如果没有客户端连接,程序就会卡在 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());
4

1 回答 1

2

听起来您正在serverSocket.accept()调用 GUI 的事件调度线程 (EDT)。Swing 依赖 EDT 来呈现和处理用户交互 - 如果您执行“接受”之类的阻塞调用,您将不会在 GUI 上看到任何更新。

您需要做的是创建一个新线程(或使用与 EDT 不同的应用程序的“主”线程),它位于接受等待客户端连接的位置。连接后它可以做它需要做的任何工作,但是当你想更新 GUI 时,你需要将代码包装在 a 中Runnable并通过SwingUtilities.invokeLater.

于 2010-01-31T04:40:21.060 回答