簡體   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