繁体   English   中英

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

[英]How to continuously read from a Java socket's inputstream despite blocking code?

我正在通过创建一个多人纸牌游戏应用程序来学习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
    }
}

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

对于此类问题是否有“最佳实践”? 我当时正在考虑在一个单独的线程中运行的过滤器的处理方式,该过滤器处理消息并将非消息反馈到主线程将循环通过的新流中。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM