最近刚接触VB,学习了用Winsock创建聊天应用程序。下面的实例分别用 TCP协议和UDP协议实现通讯。 1.选择通讯协议的标准 在使用WinSock控件时,可以使用的协议包括TCP和UDP。两种协议之 间的重要区别在于它们的连接状态:a).TCP协议控件是基于连接的协议,可以 将它同电话系统相比。在开始数据传输之前,用户必须先建立连接。b).UDP协 议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算 机发送到另一台计算机,但是两者之间没有明确的连接。 2.Winsock控件使用TCP协议 如果应用程序要使用TCP协议,那么首先必须决定应用程序是服务器还是 客户端。如果要创建一个服务器端,那么应用程序需要“监听”指定的端口。当客 户端提出连接请求时,服务器端能够接受请求并建立连接。在连接建立之后,客 户端与服务器端可以自由地互相通讯。 2.1TCP服务器端 窗体设计: ![]() 为窗体添加如下的代码: Private Sub Form_Load() '设置本地端口号为6000 Winsock1.LocalPort = 6000 '打开监听 Winsock1.Listen End Sub Private Sub Winsock1_ConnectionRequest(ByValRequestlD As Long) Dim myStr As String 如果当前状态处于连接状态,则先关闭连接,再接收新的请求 If Winsock1.State <> sckClosed Then myStr = MsgBox("客户请求建立连接,是否允许?",vbOKCancel) If myStr = vbOK Then '关闭连接 Winsock1.Close '接收客户请求,建立连接 Winsock1.Accept RequestlD Winsock1.SendData '接收 MsgBox "与客户建立了新连接" End If End If End Sub Private Sub Winsock 1_DataArrival(ByVallbytes Total As Long) Dim myStr As String '调用GetData方法接收数据 Winsock1.GetData myStr Text2.Text = myStr End Sub Private Sub Winsock1_Close() Winsock1.Close Winsock1.Listen MsgBox "与客户断开连接" End Sub Private Sub Text1_Change) '当服务器端的文本框中的内容发生变化时,使用SendData方法发送信息 Winsock1.SendData Text1.Text End Sub 2.2TCP客户端 窗体设计: ![]() 为窗体添加如下代码: Private Sub Form_Load() Text1 = "192.168.1.22" Text2 = 6000 End Sub Private Sub Command1_Click() If Winsock1.State = sckClosed Then '设置服务器的IP地址 Winsock1.RemoteHost = Trim( Text1.Text) '设置服务器的端口号 Winsock1.RemotePort = Trim( Text2.Text) '发出连接请求 Winsock1.Connect End If End Sub Private Sub Winsock 1_DataArrival(ByValbytes Total As Long) Dim myStr As String '调用GetData方法接收数据 Winsock1.GetData myStr Text4.Text = myStr Option1.Value = True End Sub Private Sub Winsock1_Close() Winsock1.Close Option2.Value = True End Sub Private Sub Text3_Change() '当xtSend控件的内容发生变化时,调用SendData将信息传送给主机 Winsock1.SendData Text3.Text End Sub 2.3运行方法 1)同时运行服务器端程序和客户端程序,得到两个示意图(略) 2)在客户端程序的界面中单击“连接”按钮,此时,服务器端程序显示“客户请 求建立连接,是否允许?” 3)单击“确定”,客户端的连接状态会变成“连接”状态,此时,两端已建立起 连接。 4)在服务器端的“发送的消息”文本框中输入信息,在客户端的“接收到的消息” 文本框中会看到同样的消息,反之亦然。 3.Winsock控件使用TCP协议 创建UDP应用程序时必须调用Bind方法,Bind方法的作用是为控件“保留” 一个本地端口。在使用UDP协议的时候,可以任意地改变RemoteHost和 RemotePort属性,同时始终保持绑定在同一个LocalPort上。TCP协议与此不 同,在改变RemoteHost和RemotePort属性之前,必须先关闭连接。因为两 台计算机的地位可以看成“平等的”,这种应用程序也被称为点到点的。服务器端 和客户端窗体布局相同,可把两端的名称分别设为“UDP通信A”“UDP通信B”, 以示区分,两端的代码也相同。 ![]() Private Sub Command1_Click() With Winsock1 '设置远程主机名 .RemoteHost = Trim(Text1.Text) '设置远程端口号 .RemotePort = Trim(Text2.Text) '绑定本地端口号 .Bind Trim(Text3.Text) End With End Sub Private Sub Text4_Change) '数据发生变化时发送消息 Winsock1.SendData Text4.Text End Sub Private Sub Winsock1_DataArrival(ByValbytes Total As Long) Dim myStr As String '接收数据 Winsock1.GetData myStr '将接收到的数据显示在文本框中 Text5.Text = myStr End Sub 运行方法:在连个工程里分别创建两端窗体,同时运行两个实例,然后, 将一个应用程序的远程端口号设置成为另一个应用程序的本地端口号,然后单击 “连接”按钮,就可以实现两个程序之间的通信了。 |
|