我通过创建多人纸牌游戏应用程序来学习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
}
}
我的问题是,从用户那里获取输入会暂停循环,从而阻止聊天窗口更新。
是否有最佳实践'对于这种问题?我正在思考过滤器的行,在一个单独的线程中运行,它处理消息并将非消息反馈回主线程将循环的新流。
答案 0 :(得分:1)
不要在EDT中进行非UI工作。总是从单独的线程中执行诸如从套接字等中读取的内容。有两种方法可以做到这一点:
SwingUtilities.invokeLater
或SwingUtilities.invokeAndWait
通知EDT更新内容。这可能是进行套接字轮询的最佳方式。SwingWorker
启动非EDT活动。我个人认为SwingWorker
仅适用于用户对某些操作的响应。