VB Winsock控件创建多个连接
|
admin
2013年12月11日 8:54
本文热度 5648
|
用VB写的一个简单的服务端程序,
服务器端程序:
Private Sub Form_Load()
tcpserver.LocalPort = 1001 '将 LocalPort 属性设置为一个整数。
tcpserver.Listen '然后调用 Listen 方法。
End Sub
Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
If tcpserver.State <> sckClosed Then tcpserver.Close '检查控件的 State 属性是否为关闭的。 '如果不是, '在接受新的连接之前先关闭此连接。
tcpserver.Accept requestID '接受具有 requestID 参数的 '连接。
msgbox("有人连接服务端")
End Sub
客服端程序
Private Sub Form_Load()
tcpClient.RemoteHost = "192.168.1.2"
tcpClient.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click() '连接按钮
tcpClient.Connect
MsgBox ("连接服务器成功")
End Sub
运行后,启动服务端,然后启动客户端,点“连接”按钮,客服端端跳出窗口“连接服务器成功”,服务端跳出窗口“有人连接服务端”。表示双方建立了连接。这个时候关闭客户端,然后再启动,点“连接”按钮,就只是跳出连接服务器成功(程序设置不完美)。然后在输入框中输入向服务端发送数据,出现“错误“40006” 所需事物请求的错误协议连接或连接状态”。这个时候发现第二次连接就不行,看来服务端只是支持单个连接,第二次连接相当于,第二个连接,就找不到服务器,这个错误跟没有启动服务端程序的错误是一样,说明客户端找不到服务端。
解决办法:创建控件数组
上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请求。利用这种方法,不需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新的实例上调用 Accept 方法。
下面的代码假定名为 sckServer 的窗体上有一个 Winsock 控件,它的 Index 属性被设置为 0;因此控件是控件数组的一部分。在声明部分,声明了一个模块级的变量 intMax。在窗体的 Load 事件中,intMax 被设置为 0,数组中第一个控件的 LocalPort 属性被设置为 1001。然后调用控件的 Listen 方法,使之成为“监听”控件。在连接请求到达时,代码将检测 Index 是否为 0(“监听”控件的值)。如果为 0,监听控件将增加 intMax 的值,并使用该号码来创建新的控件实例。然后,使用新的控件实例接受连接请求。
Private intMax As Long
Private Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 1001
sckServer(0).Listen
End Sub
Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
End If
End Sub
下面涉及到sckServer的地方全部用上 sckServer(intMax),就可以了
这样即使客户端重新启动,一样可以连接到服务端。
该文章在 2013/12/11 8:54:48 编辑过