用Winsock實現(xiàn)點對點通信

字號:

Winsock控件是VB5.0的新增功能,它解決了以往應(yīng)用VB編程時網(wǎng)絡(luò)中應(yīng)用程序之間無法實現(xiàn)點對點通信的難題。Winsock使用的TCP協(xié)議和UDP協(xié)議允許建立并保持一個到遠程計算機上的連接,且可以在連接結(jié)束之前實時地進行數(shù)據(jù)交換。
     用戶僅通過設(shè)置屬性并借助事件處理就能夠輕而易舉地連接到一個遠程的計算機上,而且只用兩個命令就可以實現(xiàn)數(shù)據(jù)交換。
    使用TCP協(xié)議時,如果需要創(chuàng)建一個客戶應(yīng)用程序,就必須識別服務(wù)器的名稱或IP地址。應(yīng)用程序的通信端口隨時都將仔細監(jiān)測對方發(fā)出的消息,這是系統(tǒng)進行可靠連接的保證。一旦連接發(fā)生,任何一方都可以通過SendData發(fā)送和接收數(shù)據(jù),并借助GetData把自己的數(shù)據(jù)分離出來。
    傳送數(shù)據(jù)時,需要先設(shè)定客戶機的LocalPort屬性,服務(wù)器則只需要把RemoteHost屬性設(shè)定為客戶機以太網(wǎng)的地址,并設(shè)定與客戶機LocalPort屬性相同的端口地址,借助SendData方法開始發(fā)送消息。客戶機則在GetData事件中通過DataArrival事件分離出發(fā)送的信息。
    一個Winsock控件可以讓本地計算機連接到遠程的計算機上,同時使用UDP或TCP協(xié)議,兩個協(xié)議都能創(chuàng)建客戶機和服務(wù)器應(yīng)用。
    使用Winsock控件時,通信的雙方需要選定相同的協(xié)議。TCP協(xié)議適用于傳送大容量、需要安全性保證的數(shù)據(jù)文件;而UDP協(xié)議適用于需要分別與很多下屬通信,或者建立的連接比較多且為時變的情況,特別是在數(shù)據(jù)量很小的時候。設(shè)定時可以使用Winsock1.Protocol = sckTCPProtocol方法,首先要找到你的計算機的名稱,并把它添入Winsock的LocalHost屬性中。
    創(chuàng)建一個應(yīng)用程序時,首先要確定你建立的是客戶方應(yīng)用還是服務(wù)器服務(wù),只有建立的服務(wù)器應(yīng)用開始工作,并進入監(jiān)聽狀態(tài)時,客戶應(yīng)用程序才開始建立連接,進入正常的通信狀態(tài)。筆者建立了一個應(yīng)用程序,它的功能是當客戶方的鼠標移動時,服務(wù)器應(yīng)用程序上能夠?qū)崟r顯示該鼠標的位置。下面是建立服務(wù)器應(yīng)用的方法:
    1.創(chuàng)建一個新的標準EXE文件;
    2.加入一個Winsock控件;
    3.加入如下代碼:
    Private Sub Form_Load()
    tcpServer.LocalPort = 1001
    tcpServer.Localhost = ″servser″
    tcpServer.remotePort = 1002
    tcpServer.Localhost = ″klint″
    tcpServer.Listen
    End Sub
    ′連接檢查
    Private Sub tcpServer_ConnectionRequest _
    (ByVal requestID As Long)
    If tcpServer.State $#@60;$#@62; sckClosed Then _
    tcp ver.Close
    tcpServer.Accept requestID
    End Sub
    ′發(fā)送數(shù)據(jù)
    Private Sub frmserver_monsemove(x,y)
    tcpServer.SendData ″x″& str(x)
    tcpServer.SendData ″y″& str(y)
    End Sub
    建立客戶應(yīng)用的方法為:
    1.創(chuàng)建一個新的標準EXE文件;
    2.加入一個Winsock控件;
    3.加入兩個TEXT框—— txt_x和 txt_y;
    4.加入如下代碼:
    Private Sub Form_Load()
    tcpServer.LocalPort = 1002
    tcpServer.Localhost = ″klint″
    tcpServer.remotePort = 1001
    tcpServer.Localhost = ″servser″
    tcpServer.Listen
    End Sub
    ′連接檢查
    Private Sub tcpklint_ConnectionRequest _
    (ByVal requestID As Long)
    If tcpklint.State $#@60;$#@62; sckClosed Then _
    tcpklint.Close
    tcpklint.Accept requestID
    End Sub
    Private Sub tcpClient_DataArrival _
    (ByVal bytesTotal As Long)
    Dim strData As String
    tcpklint.GetData strData
    if left(strData,1)=″X″then
    txt_x.Text = strData
    else
    txt_y.Text = strData
    endif
    End Sub