Java Socket的封裝

摘要: Socket通信幾乎無時不在, 當然能夠蒐集到的信息也大量存在, 爲了避免重複的勞作, 抽取了關於客戶端和服務端的Socket, 並將其應用到適合JVM(LInux/Windows)或者DVM(Android)平臺. 這個封裝好的API具有以下優勢:

1. 滿足具有Socket客戶端需求的基本應用.

2. 滿足具有Socket服務端的基本應用. 具備併發能力, 能滿足可設定個數客戶端連接.

本文的目的就是爲了對Socket做一個封裝, 方便客戶端和服務端能直接使用Socket.

封裝好的API可以從下面的鏈接獲取

Java Socket的封裝

其中src/中的是API源碼; usage/目錄是使用例程

1客戶端Socket API

要點:

1. 客戶端和指定的服務端相連, 因此客戶端需要指明服務端對應的IP地址和端口號

2. 需要設置超時返回

3. 需要設置循環等待, 因爲基本的Socket通信都是一來一回, 這種來回是通過阻塞來完成的。

4. 每個客戶端連入服務端的時候, 都具備本身的ID, 類似於HTTP的Session, 這點容易被忽視。在多客戶端連接中, 可以重點關注。本文提供的代碼也有所提及, 但沒有深入, 這點留給讀者進一步發掘。

代碼參照/usage目錄下的客戶端測試代碼, 注意, 先啓動服務端,或者你拿着NetAssis 來測試也不錯.

2 服務端Socket API

要點:

1. 服務端一般是被多個客戶端連接的, 並且這些連接要求服務端做相似的處理, 因此這裏就將這些相似處理, 抽象成一個SingleTask.java 接口, 具體的業務只需要實現這樣的接口, 就可以並行的處理這些Task.

2. 不能無限制的讓客戶端連入Server, 因此需要設置上限值

3. 啓動線程池, 每個線程針對一個具體的客戶端連接

4. 注意接收阻塞位置, 需要設置死循環, 讀不到數據將死守着等待(但別耽誤其它線程處理事情)

5. 注意服務端要在死循環中偵聽, 這樣保證不錯過任何來自客戶端的請求。

代碼參照:/usage目錄下的Server端測試代碼。

代碼中註釋很多,因此這裏就不詳細述說。


常見問題:

1. 客戶端Client的時候, 如果存在網絡問題, 爲了避免網絡問題,造成客戶端長時間等待, 此時要設置一個TimeOut


clientSocket = new Socket();
//這個TimeOut是連接等待時間
clientSocket.connect(tcpAddress, timeOut);

2. 當客戶端已經連接, 每次收到一個數據, 客戶端將啓動處理, 假如服務器長久不發數據, 此時客戶端會阻塞等待, 爲了避免這個時候的等待, 可以設置一個超時


clientSocket.setSoTimeout(timeOut);



參考文獻:

參考工具: NetAssis 使用這個工具用來測試C-S之間的通信.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章