尽管阻塞代码,如何连续读取Java套接字的输入流?

时间:2015-01-13 04:20:23

标签: java sockets

我通过创建多人纸牌游戏应用程序来学习Java Socket编程。客户端将处理游戏和一个小聊天窗口。

我的客户端从循环中读取服务器的指令,如下所示:

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
    if (line.startsWith("SOME_COMMAND") {
        // get necessary input from user
    } else if (line.startsWith("MESSAGE") {
        // tell EDT to update chat window
    }
}

我的问题是,从用户那里获取输入会暂停循环,从而阻止聊天窗口更新。

是否有最佳实践'对于这种问题?我正在思考过滤器的行,在一个单独的线程中运行,它处理消息并将非消息反馈回主线程将循环的新流。

1 个答案:

答案 0 :(得分:1)

不要在EDT中进行非UI工作。总是从单独的线程中执行诸如从套接字等中读取的内容。有两种方法可以做到这一点:

  1. 让非EDT线程使用SwingUtilities.invokeLaterSwingUtilities.invokeAndWait通知EDT更新内容。这可能是进行套接字轮询的最佳方式。
  2. 使用SwingWorker启动非EDT活动。我个人认为SwingWorker仅适用于用户对某些操作的响应。