2013-05-18 222 views
0

自從我開始思考如何使用Java套接字發送和接收數據。我希望你能幫助我找到一個好辦法。java套接字發送和接收

我已經構建了一個服務器/客戶機結構,客戶機連接到服務器並獲取自己的線程來處理請求 - 響應方法。這些信息以XML格式包裝。

服務器在開始時啓動阻塞套接字讀取。首先,我使用writeInt()來傳輸XML消息的長度。之後,服務器讀取長度字節的數量並解析消息。傳輸之後,客戶端進入接收狀態並等待響應。

這很好,但是在客戶端驗證服務器之後等待將會出現並阻止的事情。

但是當服務器沒有需要傳輸的信息時我應該怎麼做。我可以嘗試銷燬讀取阻塞並將消息發送給客戶端。但是,如果客戶想到他也有消息並開始發送,會發生什麼。在那一刻,沒有人會聽。

因此,也許我可以使用某種緩衝區,但我有這種感覺,這不是我應該去的方式。

我一直在尋找一段時間,發現了一些有趣的信息,但我沒有很好地理解它們。可悲的是,我的書只是關於這個簡單的套接字模型。

也許我應該使用兩個線程。一個發送一個接收。服務器有一個數據庫,用於存儲消息並等待傳輸。所以當服務器收到一條消息時,他會將該消息存儲在數據庫中,並且「接收到的消息」等答案也會存儲在數據庫中。發送者線程會查看是否有新消息並將「收到消息」發送給客戶端。這種方法不會以毫秒爲單位發送答案,但我可以想象它會工作得很好。

我希望我給你足夠的關於我所嘗試的信息。你會推薦我如何實施這種溝通?

感謝

+0

看看http://code.google。com/p/quickserver /(下載壓縮包含所有代碼和許多抽樣以便開始使用) – tgkprog

回答

0

但服務器現在需要被髮送的信息時,我應該做的。

我會使服務器寫入同步。這將允許您在一個線程中響應請求,但也可以根據另一個線程的要求發送其他消息。對於客戶端,您可以有一個單獨的線程進行接收。

一個簡單的模型可能會有兩個套接字。一個套接字就像現在這樣工作,當你「登錄」一個唯一的ID時就會發送給客戶端。在這一點上,客戶端用專用線程打開第二個連接,以偵聽異步事件。它傳遞唯一的ID,以便服務器知道異步消息是用於哪個客戶端。

這會給你一個簡單的同步模式,就像你現在有一個簡單的異步模式。唯一的缺點是你有兩個套接字連接,你有協調它們。

+0

這對於少數客戶端來說可以,但對於多客戶端而言,您將會浪費套接字 – tgkprog

+0

@tgkprog什麼是浪費套接字? ;) –

+0

對於OS的套接字存在硬限制。如果你有幾千個客戶,沒有什麼區別,但是當有很多客戶端從互聯網連接時,我已經看到了與jboss節點有關的套接字錯誤,並且我們連接到HSM,dbs和其他資源 - 所有這些都在一點是套接字。 – tgkprog