摘要: Socket通信幾乎無時不在, 當然能夠蒐集到的信息也大量存在, 爲了避免重複的勞作, 抽取了關於客戶端和服務端的Socket, 並將其應用到適合JVM(LInux/Windows)或者DVM(Android)平臺. 這個封裝好的API具有以下優勢:
1. 滿足具有Socket客戶端需求的基本應用.
2. 滿足具有Socket服務端的基本應用. 具備併發能力, 能滿足可設定個數客戶端連接.
本文的目的就是爲了對Socket做一個封裝, 方便客戶端和服務端能直接使用Socket.
封裝好的API可以從下面的鏈接獲取
其中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之間的通信.