SOCKET:
Socket介面介於應用程式與硬體之間。對Socket的理解可以簡化為:它是封裝了資料流(Stream)的從機器到機器的一條軟接線,通過這條軟接線,並藉助於線兩端的收發程式,網路上的機器間實現了資訊的交流與互連。分離在軟線兩端的應用程式(伺服器端程式和用戶端程式)可以通過調用Socket介面來開發具有TCP/IP網路功能的程式應用。
作為用戶端,即要知道服務程式所在房間的房間號(IP地址),又要知道後門的位置(連接埠)。這樣才能正確地進入房間。
數據編發:
軟線建立完成後,還必須有資料轉送的規則,這就是服務端和用戶端商量著來的事情了。資料使用什麼封裝,傳送時遵循什麼規則(收發協議)、傳輸是否採用壓縮技術和加解密技術等。將資料封裝起來,可以讓程式的設計者像操作本地檔案一樣來操作流動在網路上的資訊。不同的資料封裝方式將決定用戶端和伺服器端資料的訪問方式。編髮類型僅限於標量(基本型別)和字串對象。複雜對象需要我們考慮有關對象到位元組的序列化以及位元組流到對象的還原問題。
多線程
作為一種常式服務,必須要考慮其同時服務於多使用者的問題。這個問題的解決可以通過線程技術來實現,而且相當簡單。基本思路是:在伺服器內產生單一的監聽Socket,並迴圈調用accept()等待新的軟線串連。Accept()每返回一次,就會帶回與特定客戶有關的Socket,將該Socket的運作安排到一個獨立的線程中,這樣其服務就是針對特定客戶的了。考慮到多線程對共用資源訪問時的同步問題如果處理不當就會造成線程的不安全,必須為臨界區設定線程鎖。
基於TCP的收發協議
使用Socket編程,必須明確用戶端與伺服器端的收發協議。以下是針對該執行個體定義的收發協議:
用戶端:發送前序9999,發送使用者名稱(String),發送密碼(String)
服務端:接收前序9999,接收使用者名稱和密碼,驗證登入許可權
是合法使用者:發送前序9999,發送歡迎資訊(String)
是非法使用者:發送前序-1,發送警告資訊(UTF)
用戶端:接收前序9999,擷取歡迎資訊(String)