我們在煙臺項目的網絡傳輸部分研究中涉及到了Winsock編程,經過較長時間的學習,做出了幾個模型。本文是我在工作過程中的一些體會,不足之處請大家指正。
1. 簡介
在Windows下的各種網絡編程接口中,Windows Sockets脫穎而出,這是因為indows Sockets規范是一套開放的、支持多種協議的Windows下的網絡編程接口。利用 WinSock 控件可以與遠程計算機建立連接,并通過用戶數據文報協議 (UDP)或者傳輸控制協議 (TCP)進行數據交換。這兩種協議都可以用來創建客戶與服務器應用程序。
Windows Sockets規范是建立在Beckley套接口模型上的, 這個模型現在已是TCP/IP網絡的標準,所謂套接口就是指通信的一端。套接口通常和同一個域中的套接口交換數據(數據交換也可能穿越域的界限,但這時一定要執行某種解釋程序)。目前可以使用兩種套接口,即流套接口和數據報套接口。流套接口提供了雙向的,有序的,無重復并且無記錄邊界的數據流服務。數據報套接口支持雙向的數據流,但并不保證是可靠,有序,無重復的。我們在編程中只用到了流式套接口,無序的、可靠性較低的數據報套接口不能滿足系統對準確高效數據傳輸的要求。
2. 客戶機\服務器模型
一個在建立分布式應用時最常用的范例便是客戶機/服務器模型。在這種方案中客戶應用程序向服務器程序請求服務,服務器程序請求服務響應客戶端的請求。通信的基石是套接口,所有的請求、響應工作都是由套接口完成的。
3. 套接口網絡編程原理
流式套接口定義了一種可靠的面向連接的服務,實現了無差錯無重復的順序數據傳輸。
使用面向連接的套接口編程,其流程可由下圖表示:
服務器Socket 客戶端Socket4. Peer- to- Peer 通信程序 現在做一個具體的程序。這個程序是用VB寫的,因為VB把Socket做成了控件,使用起來非常方便。這是一個點到點通信程序,功能是通信雙方雙工傳送字符串。這個程序屏蔽了一個事實,及C\S模型,但在程序運行時必須先啟動服務器。
服務器端:
建立一個新的工程,把Microsoft Winsock Control 控件加進來,如下圖放置控件,主要就五個:兩個文本框用于顯示收到數據以及輸入發送數據;一個CommandBotton于發送數據;一個小圖標顯示是否聯接(聯接了就顯示出來visible=True);最主要的是Winsock控件,所有的事都是它干的,而且從不顯示出來(默默無聞)。
下面是代碼,注釋的較為清楚:
Option Explicit
Dim IsConnectionOpen As Boolean
Private Sub Command1_Click()
If IsConnectionOpen = False Then
MsgBox "未建立聯接!" '如果未建立連接,就彈出這么一個對話框
Else
Winsock1.SendData Text2.Text
'Socket就這么把數據發出去了,很簡單
End If
End Sub
Private Sub Form_Load()
Winsock1.LocalPort = 1111
Winsock1.Listen 'Socket在程序啟動時監聽端口1111
Image1.Visible = False
IsConnectionOpen = False '開始狀態為未聯接
End Sub
Private Sub Winsock1_Close() '對方Socket關閉觸發這個事件
Winsock1.Close '關閉自己
End '那也就把程序關了吧
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) '接收到對方聯接
'請求觸發這個事件
If Winsock1.State <> sckClosed Then Winsock1.Close '使Socket在接收
'聯接請求之前保持關閉狀態
Winsock1.Accept requestID 'Winsock1自己接收聯接請求,與客戶端Socket
'建立聯接
IsConnectionOpen = True
Image1.Visible = True '現在聯接好了
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)'收到數據觸發這個事件
Dim str As String
Winsock1.GetData str '收到數據時,Winsock1把數據寫入緩存str
Text1.Text = Text1.Text + str + Chr (13) + Chr (10)
Text1.SelStart = Len (Text1.Text)
'在文本框中顯示接收的數據
End Sub
客戶端:
同樣也建立一個新的工程,把Winsock控件加進來。布局如下,比服務器稍微復
雜,因為客戶端發出聯接請求,因此多出兩個文本框用于輸入服務器的地址及端口給
Winsock控件,一個CommandBotton用于聯接:
代碼:
Option Explicit
Dim IsConnectionOpen As Boolean
Private Sub Command1_Click() '聯接按鈕
Winsock1.RemoteHost = Text1.Text
Winsock1.RemotePort = CLng(Text2.Text) '填好Socket的對方地址
'及對方端口號
Winsock1.Connect 'Socket發送聯接請求,當聯接成功時出發Winsock的
'Connect事件(看下邊)
End Sub
Private Sub Command2_Click() '發送按鈕
If IsConnectionOpen = False Then
MsgBox "未建立聯接!"
Else
Winsock1.SendData Text3.Text
End If '同服務器端一樣
End Sub
Private Sub Form_Load()
Text1.Text = "sjn"
Text2.Text = "1111" '程序啟動時兩個文本框先顯示服務器的地址
'及端口號,無所謂,反正可以修改
Image1.Visible = False
IsConnectionOpen = False '一開始未聯接
End Sub
Private Sub Winsock1_Close()
Winsock1.Close
End '同服務器端一樣
End Sub
Private Sub Winsock1_Connect() '聯接成功時觸發
IsConnectionOpen = True
Image1.Visible = True '聯接成功了
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim str As String
Winsock1.GetData str
Text4.Text = Text4.Text + str + Chr(13) + Chr(10)
Text4.SelStart = Len(Text4.Text) '同服務器端一樣
End Sub
至此,服務器與客戶端均建立了。
運行時,服務器與客戶端可分別放在兩臺機器上,也可以反放在一臺機器上,無所謂。
先啟動服務器,再運行客戶端,現在你就可以胡說八道了。
兩個程序的流程:(其實前面的圖表已顯示了,但有必要再羅嗦一下)
服務器:
戶端:
K,現在咱們已經建好了一個簡單的C\S通信模型,確實很簡單吧。再進一步,我們還可以加入很多功能,例如,通過 .Accept 方法,以及把Winsock控件做成數組,服務器可以與多個客戶端建立連接,實現一個簡單的聊天室。
關于Winsock控件:
1. 客戶端的Socket必須準確填寫雙方約定的服務器的地址及監聽端口,否則,它可不知道可設進行聯接。
2. 雙方通信是由Socket通信實體完成的,協議一般采用TCP協議,以保證準確的傳輸。
3. 具體的事件和方法見 程序及MSDN->目錄->Visual Basic文檔->使用VB->部件工具指南->使用ActiveX控件->使用Winsock控件 (里面寫的相當詳細)
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/
領測軟件測試網最新更新
關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月