• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        用Delphi完成WinSocket高級應用

        用Delphi完成WinSocket高級應用

        更新時間:2021-11-16 文章作者:未知 信息來源:網絡 閱讀次數:

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

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

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

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

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

        在獨立的ClientSocket中,屬性Socket.Data 是一個指針,缺省值是nil ;在ServerSocket的每個獨立的Socket.Connections[Index]中, 屬性Data也是一個指針,缺省值是nil 。因此,可以通過該指針建立并保存各自獨立的相關信息,用于實現各自獨立的通信。而在ClientSocket的事件 OnRead中,調用方法傳遞的Socket值就是響應該事件的對象屬性ClientSocket.Socket 。同樣,在 ServerSocket的事件OnClientRead中,調用方法傳遞的參數Socket就是對應于當前發送數據客戶端的唯一的Socket連接,即ServerSocket.Socket.Connections[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:下載成功。
        其中,發送中間的包和收到中間的包根據包的數量可以重復。不難看出,上面的兩個過程是典型的“你一句我一句”的應答方式。

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

        Client.DPR
        uClient.PAS(.DFM)(一個ClientSocket組件、一個按鈕、一個標簽、一個進度條)
        uClientMain.PAS(.DFM)(用于選擇文件的一組控件和一個Edit控件、三個按鈕)
        uSocketCommon.PAS
        服務器端應用程序包括:

        Server.DPR
        uServer.PAS(.DFM)(一個ServerSocket組件、一個Memo控件、兩個按鈕)
        uSocketCommon.PAS
        其中,單元uSocketCommon 中包括了Socket編程的主要代碼,是客戶端應用程序和服務器端應用程序都需要的。

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

        數據收發是通過會話建立和撤消的;
        客戶端是主動連接,服務程序是被動連接;
        每次收發的數據包,其容量是有限的,應當在設計時充分考慮;
        一個ClientSocket只能建立一個與ServerSocket的連接;
        一個ServerSocket可以建立多個與ClientSocket的連接;
        每一對連接都有唯一用于該連接的一對(兩個)Socket,可以通過Data屬性進行標記區分;
        不要對無效的數據包進行響應,否則可能會導致服務程序死鎖;
        可以在傳送的包中包含身份驗證信息以確認是有效的數據。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 久久免费国产视频| 五月天婷婷精品免费视频| 免费成人在线视频观看| 久久久精品国产亚洲成人满18免费网站| 亚洲欧洲日韩极速播放| 91成人免费观看网站| 亚洲性色高清完整版在线观看| 99re6免费视频| 老司机亚洲精品影院无码| 98精品全国免费观看视频| 久久亚洲精品无码aⅴ大香| 永久看日本大片免费35分钟| 亚洲激情在线观看| 精品无码免费专区毛片| 波多野结衣亚洲一级| 国产老女人精品免费视频| 免费精品国自产拍在线播放| 亚洲综合AV在线在线播放| 巨胸喷奶水视频www免费视频| 国产精品亚洲片在线| 精品无码AV无码免费专区| 亚洲av无码一区二区三区天堂古代| 国产卡一卡二卡三免费入口| 亚洲国产欧洲综合997久久| 亚洲A∨精品一区二区三区| 天堂亚洲免费视频| 色噜噜综合亚洲av中文无码| 在线看片韩国免费人成视频| 亚洲AV无码一区二区三区性色| 国产大片51精品免费观看| 久久九九久精品国产免费直播| 亚洲最大成人网色| 四虎www成人影院免费观看| 黄色网页在线免费观看| 亚洲美女视频网址| 国产网站免费观看| 日韩视频在线观看免费| 亚洲欧洲精品成人久久曰| 77777亚洲午夜久久多人| 无码乱肉视频免费大全合集| 污网站在线免费观看|