日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

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

用Delphi完成WinSocket高級應用

用Delphi完成WinSocket高級應用

更新時間:2021-11-16 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

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

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

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

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

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

在獨立的ClientSocket中,屬性Socket.Data 是一個指針,缺省值是nil ;在ServerSocket的每個獨立的Socket.Connections[Index]中, 屬性Data也是一個指針,缺省值是nil 。因此,可以通過該指針建立并保存各自獨立的相關信息,用于實現(xiàn)各自獨立的通信。而在ClientSocket的事件 OnRead中,調(diào)用方法傳遞的Socket值就是響應該事件的對象屬性ClientSocket.Socket 。同樣,在 ServerSocket的事件OnClientRead中,調(diào)用方法傳遞的參數(shù)Socket就是對應于當前發(fā)送數(shù)據(jù)客戶端的唯一的Socket連接,即ServerSocket.Socket.Connections[Index]。這樣,就能夠對不同的連接分得清清楚楚明明白白。

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

C:請求上傳文件;
S:準備就緒,可以接收;
C:需要上傳的文件信息;
S:收到文件信息:
C:第一個包;
S:收到第一個包;創(chuàng)建文件,開始寫數(shù)據(jù);
C:中間的包;
S:收到中間的包;繼續(xù)寫數(shù)據(jù);
C:發(fā)送最后一個包,關閉文件;
S:收到最后一個包;寫數(shù)據(jù),關閉文件。
下載文件的過程是這樣的:

C:請求下載文件;
S:準備就緒,可以下載;
C:需要下載的文件信息(文件名);
S:反饋文件信息(文件大小);
C:準備就緒,可以接收數(shù)據(jù);
S:第一個包;
C:收到第一個包;創(chuàng)建文件,開始寫數(shù)據(jù);
S:中間的包;
C:收到中間的包;繼續(xù)寫數(shù)據(jù);
S:發(fā)送最后一個包,關閉文件;
C:收到最后一個包;寫數(shù)據(jù),關閉文件;下載成功;
S:下載成功。
其中,發(fā)送中間的包和收到中間的包根據(jù)包的數(shù)量可以重復。不難看出,上面的兩個過程是典型的“你一句我一句”的應答方式。

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

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編程作如下總結:

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

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

本類教程下載

系統(tǒng)下載排行

主站蜘蛛池模板: 精品欧美高清不卡在线 | 国产欧美在线一区二区三区 | 男女高清性高爱潮免费 | 国产精品一区二区久久精品 | 久久草影视| 色综合久久88中文字幕 | 99久久免费精品 | 青青青国产视频 | 国产成人v视频在线观看 | 日本一区二区三区在线观看视频 | 精品综合久久久久久99 | 成人激情小视频 | 欧美综合自拍亚洲综合百度 | 国产对白91色拍高清精品 | www.操.com| 午夜在线 | 中文字幕日韩一区二区三区不卡 | 日韩视频在线免费观看 | 91网站视频在线观看 | 久久婷婷国产综合精品青草 | 日韩 欧美 自拍 | 国产精品亚洲一区二区三区在线观看 | 日本videosbest极品 | 欧美在线专区 | 精品国产综合成人亚洲区 | 欧美日本一区视频免费 | 黄 色 片 在 线 看 | 2021国内精品久久久久久影院 | 国产亚洲欧洲一区二区三区 | 黄网站色视频免费观看w | 自拍中文字幕 | 日韩精品欧美精品中文精品 | 久久美女精品国产精品亚洲 | japanese色系tube日本护士 | 日本成人一区二区 | 国产精品视频在这里有精品 | 日本欧美在线播放 | 欧美人人草| 久久免费视频2 | 亚洲va国产日韩欧美精品色婷婷 | 三级在线观看 |