熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

用Delphi實現WinSocket高級應用

2013-11-23 17:44:58  來源: Delphi編程 

  Socket通信在Windows 中是排隊的形式由操作系統處理而且接收方和發送方相互協同工作否則就會造成數據丟失因此不能用類似於for 語句的循環來實現對多組數據的發送更不能用循環語句來接收數據比如你可以用for 語句來實型若干文件的復制這很普遍也很正常但在 Socket編程以及大多數網絡應用編程中都是行不通的因為網絡通信的基本方式是請求和應答另外和所有的通信編程一樣Socket編程也遵循數據分包傳送這一基本規則也就是說在 Socket編程中每次發送和接收一個包以保證數據傳輸的安全性和穩定性同時也不至於過多地占用系統資源

  對於ClientSocket組件從字面上就可以看出它用於請求方也就是說它的動作是主動地建立連接顯然ServerSocket組件用於響應方它的動作是偵聽以及被動接受連接

  組件ClientSocket的屬性是相對靜態的它和ServerSocket之間只是連接和斷開的關系並且僅當ServerSocket對其接受才表示建立連接

  組件ServerSocket的屬性是動態的伴隨著一個新的ClientSocket與之建立連接的同時就會產生一個新的Socket與該ClientSocket對應保持單獨的連接進行單獨的通信因此在同一個 ServerSocket中可以與多個ClientSocket保持同時連接和各自獨立的通信ServerSocket的屬性 SocketActiveConnections用於表示客戶端連接的數量屬性SocketConnections[Index] 則用於訪問單個與ClientSocket連接的Socket

  正是這樣的結構才使得WinSocket 技術能夠穩定實現一個服務程序向多個客戶端提供服務

  在獨立的ClientSocket中屬性SocketData 是一個指針缺省值是nil 在ServerSocket的每個獨立的SocketConnections[Index]中 屬性Data也是一個指針缺省值是nil 因此可以通過該指針建立並保存各自獨立的相關信息用於實現各自獨立的通信而在ClientSocket的事件 OnRead中調用方法傳遞的Socket值就是響應該事件的對象屬性ClientSocketSocket 同樣在 ServerSocket的事件OnClientRead中調用方法傳遞的參數Socket就是對應於當前發送數據客戶端的唯一的Socket連接即ServerSocketSocketConnections[Index]這樣就能夠對不同的連接分得清清楚楚明明白白

  首先介紹實例程序的設計思想上傳文件的過程是這樣的(這裡的C和S分別代表客戶端和服務器端)

  C請求上傳文件
  S准備就緒可以接收
  C需要上傳的文件信息
  S收到文件信息
  C第一個包
  S收到第一個包創建文件開始寫數據
  C中間的包
  S收到中間的包繼續寫數據
  C發送最後一個包關閉文件
  S收到最後一個包寫數據關閉文件

  下載文件的過程是這樣的

  C請求下載文件
  S准備就緒可以下載
  C需要下載的文件信息(文件名)
  S反饋文件信息(文件大小)
  C准備就緒可以接收數據
  S第一個包
  C收到第一個包創建文件開始寫數據
  S中間的包
  C收到中間的包繼續寫數據
  S發送最後一個包關閉文件
  C收到最後一個包寫數據關閉文件下載成功
  S下載成功

  其中發送中間的包和收到中間的包根據包的數量可以重復不難看出上面的兩個過程是典型的你一句我一句的應答方式

  下面是客戶端應用程序和服務器端應用程序的結構客戶端應用程序包括

ClientDPR
uClientPAS(DFM)(一個ClientSocket組件一個按鈕一個標簽一個進度條)
uClientMainPAS(DFM)(用於選擇文件的一組控件和一個Edit控件三個按鈕)
uSocketCommonPAS

  服務器端應用程序包括

ServerDPR
uServerPAS(DFM)(一個ServerSocket組件一個Memo控件兩個按鈕)
uSocketCommonPAS

  其中單元uSocketCommon 中包括了Socket編程的主要代碼是客戶端應用程序和服務器端應用程序都需要的

  結合本例可以對Delphi中的WinSocket編程作如下總結

  ◆  數據收發是通過會話建立和撤消的

  ◆  客戶端是主動連接服務程序是被動連接

  ◆  每次收發的數據包其容量是有限的應當在設計時充分考慮
  
  ◆  一個ClientSocket只能建立一個與ServerSocket的連接

  ◆  一個ServerSocket可以建立多個與ClientSocket的連接

  ◆  每一對連接都有唯一用於該連接的一對(兩個)Socket可以通過Data屬性進行標記區分

  ◆  不要對無效的數據包進行響應否則可能會導致服務程序死鎖

  ◆  可以在傳送的包中包含身份驗證信息以確認是有效的數據


From:http://tw.wingwit.com/Article/program/Delphi/201311/25007.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.