程序在ServerSocket.accept - Java上没有响应

时间:2010-01-31 04:33:33

标签: java sockets interrupt freeze

我的程序只侦听一次连接...如果没有客户端连接,程序就会卡在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 个答案:

答案 0 :(得分:2)

听起来你正在对GUI的事件调度线程(EDT)进行serverSocket.accept()调用。 Swing依赖于EDT来呈现和处理用户交互 - 如果你执行像“accept”这样的阻塞调用,你就不会在GUI上看到任何更新。

您需要做的是创建一个新线程(或使用应用程序的“主”线程,该线程与EDT不同)位于等待客户端连接的接受上。在连接之后,它可以完成所需的任何工作,但是当您想要更新GUI时,需要包装代码以在Runnable中进行更新并通过{{1将其传递给EDT }}