2010-01-09 111 views
2

我們正在爲每個客戶端服務器構建一個異步線程,並偶然發現問題。我們希望線程始終準備好從套接字讀取或寫入\。我們目前使用的套接字的讀取方法是阻塞的,因此我們不能發出任何寫入請求。讀寫套接字

  • 有沒有辦法中斷讀取操作?
  • 也許最好有主服務器線程負責寫入套接字?

如果是這樣,它是否仍然符合每個客戶端設計模式的線程?

回答

1

您應該使用單獨的線程,一個用於讀取,一個用於寫入,並使用某種同步方法(例如,用互斥鎖保護的共享緩衝區)在兩者之間進行通信。另外,可以使用select調用來查看套接字上是否有任何待處理的數據。

更新

我本來想從C哦select()函數調用的好。

我可以在Java API中找到的最接近的東西是Socket.getInputStream(),它爲您提供了一個可以測試的流,以確定字節是否可用於讀取或不從底層套接字讀取。

+0

你能詳細說說select()嗎?我不能在socket API中找到它 – kfiroo 2010-01-09 17:07:53

2

使用異步(非阻塞)套接字IO。或者你也可以使用一個單獨的線程來寫作。

2

確保套接字是非阻塞的(FIONBIO我認爲)。並使用select()來確定何時可以讀取數據。

+0

使用非阻塞套接字通道有何幫助?我們是否應該重複檢查讀寫準備情況?這似乎有點低效。 – kfiroo 2010-01-09 17:10:25

+0

select()函數是需要照顧的。用它來知道什麼時候在一個套接字(或一組套接字)上讀取數據。然後嘗試從套接字讀取數據。非阻塞選項只是保證在套接字上的讀取將立即返回而不存在任何數據。 – 2010-01-09 18:25:07