在VB中使用Winsock实现通信
2007-12-11 10:08:35|
最近刚接触VB,学习了用Winsock创建聊天应用程序。下面的实例分别用TCP协议和UDP协议实现通讯。 1. 选择通讯协议的标准
在使用WinSock控件时,可以使用的协议包括TCP和UDP。两种协议之间的重要区别在于它们的连接状态:a).TCP协议控件是基于连接的协议,可以将它同电话系统相比。在开始数据传输之前,用户必须先建立连接。b).UDP协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。 2. Winsock控件使用TCP协议
如果应用程序要使用TCP协议,那么首先必须决定应用程序是服务器还是客户端。如果要创建一个服务器端,那么应用程序需要“监听”指定的端口。当客户端提出连接请求时,服务器端能够接受请求并建立连接。在连接建立之后,客户端与服务器端可以自由地互相通讯。 2.1 TCP服务器端 窗体设计:
为窗体添加如下的代码: Private Sub Form_Load() '设置本地端口号为6000 Winsock1.LocalPort = 6000 '打开监听 Winsock1.Listen End Sub
Private Sub Winsock1_ConnectionRequest(ByValRequestID As Long) Dim myStr As String
'如果当前状态处于连接状态,则先关闭连接,再接收新的请求 If Winsock1.State <>sckClosed Then
myStr = MsgBox(\客户请求建立连接,是否允许?\ If myStr = vbOK Then '关闭连接 Winsock1.Close
'接收客户请求,建立连接 Winsock1.Accept RequestID Winsock1.SendData \接收\ MsgBox \与客户建立了新连接\ End If End If End Sub
Private Sub Winsock1_DataArrival(ByValbytesTotal 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.2 TCP客户端 窗体设计:
为窗体添加如下代码: Private Sub Form_Load() Text1 = \ 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 Winsock1_DataArrival(ByValbytesTotal 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()
'当txtSend控件的内容发生变化时,调用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