簡體   English   中英

如何在 Java 中使用套接字輸入/輸出流捕獲“事件”?

[英]How to catch "event" with socket Input/Output stream in Java?

有沒有可能通過事件與客戶溝通? 我的意思是:

我已經連接了客戶端InputStreamReaderPrintWriter

in = new BufferedReader(new InputStreamReader(
                        client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);

當我使用in.readLine()服務器等待傳入數據。 但我有這種情況:

  1. 客戶端沒有發送任何數據
  2. 連接仍然存在
  3. 我需要向客戶端發送一些數據(但in.readLine()仍在掛起進程)並等待響應

問題是:處理異步傳入數據的最佳方法是什么? 我的意思是“事件”之類的東西。 我應該為讀取創建線程,為寫入創建另一個線程嗎? 如果我可以在一個線程中完成,你能舉一個代碼的例子嗎? 是否可以中止等待in.readLine()

在我看來,如果您希望程序異步運行,最好有一個單獨的線程來執行套接字 IO。 看看http://en.wikipedia.org/wiki/Observer_pattern

對於一個簡單的應用程序,我要做的是創建一個單獨的線程來偵聽傳入的數據,並將“觀察者”或“事件偵聽器”注冊到該線程。 當數據傳入時,通知您的觀察者,以便他們執行必要的操作。

當偵聽器線程空閑等待數據時,您的主線程仍然可以正常進行。

確保您也熟悉 Java 並發編程

Java 通過java.nio包提供非阻塞 i/o( 請參閱此處)。 但是 Java 的“nio”通道不能與來自java.io流進行互操作。 因此,如果您想使用 nio,則必須從偵聽器開始使用 nio 構建您的服務器。

如果您堅持使用現有的java.io流,那么您要么必須使用每個客戶端的線程模型; 或者您需要設計一個系統,讓單個線程(或線程池)通過重復循環來管理一堆客戶端,輪詢instream.available()以確定哪些數據已准備好處理。 當然,在后一種情況下,您希望避免忙循環,因此適當使用 Thread.sleep 可能也是有序的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM