簡體   English   中英

建立連接后,Java套接字讀未接收到發送的寫操作

[英]Java socket read not receiving write sent immediately after connection is established

我有一個Java客戶端和服務器,我正在嘗試編寫Junit測試。 在測試中,我等待服務器和客戶端之間建立連接,然后將一條消息從服務器發送到客戶端以測試通信。 我發現我是否立即進行寫操作,但仍未收到,並且客戶端在BufferedReader.readLine()方法上保持阻塞狀態。 如果我在套接字連接和服務器寫調用之間添加了半秒的睡眠,則一切運行正常。

我試圖弄清楚為什么需要睡眠。 我知道套接字已經生成,並且在我的waitForConnection()方法返回帶有服務器和客戶端已連接的報告的返回值之前,已將套接字的輸入流包裹着bufferedReader。 我最好的猜測是,我需要確保在服務器調用客戶端的readLine方法之前,先調用客戶端的readLine方法。 但我以為套接字會自動緩沖傳入的,不是立即讀取的輸入?

任何人都可以確認(或駁斥)我的懷疑,即我必須保證客戶端在服務器調用write之前已調用readline。 並且如果需要這樣做,誰能提出一種方法,使服務器可以檢測客戶端是否准備好接收輸入,而無需執行除TCP握手之外的其他握手?

編輯:我早該說過了,但是失敗的測試是測試當舊的失敗時重新建立連接的能力。 客戶端連接后,我的模擬服務器殺死了socket / serverSocket,幾秒鍾后重新打開了一個新的serverSocket並接受了來自客戶端的新連接。 客戶端第二次建立連接之后,寫入才會失敗。 我的較早測試僅測試連接,並且客戶端收到寫操作似乎起作用。

謝謝

任何人都可以確認(或駁斥)我的懷疑,即我必須保證客戶端在服務器調用write之前已調用readline。

你不知道 服務器可以根據需要發送任何時間。

如果需要的話

不是。

您的問題出在其他地方。

我遇到了同樣的問題,甚至想到了一個麻煩的確認過程。 但是實際上,您不需要等待read調用就可以解決問題了。

就我而言,我將read調用委托給了一個單獨的線程。 但是盡管線程中進行了read ,但jUnit測試已成功完成

  • 還沒接到電話
  • 仍在閱讀過程中或
  • 更糟糕的是:線程甚至沒有達到運行狀態

當主jUnit-Thread已終止時。

為了證明我的假設,您可以將等待放在單元測試的末尾,而不是“在套接字連接和服務器寫調用之間”,發送/接收仍然可以進行。

僅出於完整性考慮:不要忘記調用flush()

您無需在服務器寫入之前確保客戶端正在讀取。 網絡層將緩沖流量,直到流量被消耗為止。

在服務器上發出消息后,請確保在OutputStream上調用flush。 否則,在緩沖區填滿之前可能無法進行實際的網絡調用。 另外,您對readLine的使用可能會出現問題。 也許您不是在發出行終止符? 最好使用更基本的read(char [])方法。

如何在單元測試中銷毀服務器插槽? 可能是您在發送數據之前關閉了套接字。

暫無
暫無

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

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