對於ClientSocket組件,從字面上可以看出它是為請求方使用的,也就是說它的動作是主動建立連接。顯然,ServerSocket組件是用於響應方的,它的作用是監聽和被動接受連接。
組件ClientSocket的屬性是相對靜態的,它和ServerSocket之間只有連接和斷開的關系,只有ServerSocket接受它才意味著建立連接。
組件ServerSocket的屬性是動態的。當壹個新的ClientSocket與它建立連接時,會產生壹個新的Socket,它會與ClientSocket保持單獨的連接進行單獨的通信,這樣就可以與同壹個ServerSocket中的多個客戶端Socket保持同時連接和獨立通信。ServerSocket的屬性Socket ActiveConnections用於指示客戶端連接數,而屬性Socket Connections[Index]用於訪問連接到客戶端套接字的單個套接字。
正是這種結構使得WinSocket技術能夠穩定地實現壹個服務程序為多個客戶端提供服務。
在獨立的ClientSocket中,屬性Socket數據是壹個指針,在ServerSocket的每個獨立Socket連接[index]中默認值是nil。屬性數據也是指針,默認值為nil,所以可以通過這個指針建立並保存獨立的相關信息,實現獨立通信,而ClientSocket的event OnRead中調用方法傳遞的Socket值就是響應這個事件的對象屬性。客戶端套接字也在服務器套接字中。OnClient中調用方法傳遞的參數Socket是當前發送數據客戶端對應的唯壹Socket連接,即server Socket Socket connections[index],這樣就可以清楚地區分不同的連接。
首先,介紹了示例程序的設計思想。上傳文件的過程是這樣的(其中C和S分別代表客戶端和服務器端)。
上傳文件的請求。s準備接收C需要上傳的文件信息。s接收文件信息。c第壹個包S接收第壹個包創建文件,開始寫數據。中間包S接收中間包並繼續寫入數據。發送最後壹個數據包並關閉文件。s接收最後壹個寫入數據的數據包。下載文件的過程如下。
C請求下載文件S準備好下載文件信息(文件名)S反饋文件信息(文件大小)C準備好接收數據S第壹個包C收到第壹個包創建文件開始寫數據S中間的包C收到中間的包繼續寫數據S最後壹個包發送完畢文件關閉。最後壹個數據包被寫入,文件被關閉。成功下載成功下載,發送中間數據包並接收中間數據包。可以根據包數重復。不難看出,以上兩個過程都是典型的應對方式。
下面是客戶端應用程序和服務器應用程序的結構。客戶端應用程序包括
客戶端DPR uClient PAS( DFM)(壹個ClientSocket組件,壹個按鈕,壹個標簽和壹個進度條)uClientMain PAS( DFM)(壹組用於選擇文件的控件和壹個編輯控件,三個按鈕)uSocketCommon PAS服務器端應用程序包括
Server DPR uServer PAS( DFM)(壹個ServerSocket組件,壹個Memo控件和兩個按鈕)uSocketCommon PAS,其中Socket編程的主要代碼包含在uSocketCommon單元中,客戶端和服務器應用程序都需要這個單元。
結合這個例子,Delphi中的WinSocket編程可以總結如下。
Lishi Xinzhi/Article/program/Delphi/201311/25007