在ConnectionRequest事件中首先加载一个Socket控件,再用它来接收连接。 Dim SockNum As Integer SockNum=0 Sub SockServer_ConnectionRequest(...) SockNum=SockNum+1 Load SockServer(SockNum) SockServer(SockNum).Accept requestID End Sub 接收客户发送的数据 和 向客户发送的数据
接收客户发送的数据 在DataArrival事件中将多一个Index参数,用于表示哪一个控件接收到了数据。 Sub SockServer_DataArrival(Index As Integer,ByVal bytesTotal As Long) Dim s As String SockServer(Index).GetData s End Sub 向客户发送的数据 哪一个控件需要发送,只需加上数组下标。 SockServer(n).SendData Text1.Text 响应客户关闭 和 主动关闭连接
响应客户关闭 同样在Close事件中也会增加Index参数表示哪一个连接关闭。 Sub SockServer_Close(Index As Integer) SockServer(Index).Close End Sub 主动关闭连接 哪一个连接需要主动关闭,只需增加数组下标。 SockServer(n).Close
INVALID OPERATION AT CURRENT STATEsckInvalidOp 40020 在目前状态下,操作失败检查你的代码一般是这样引起的,客户端已经使用winsock控件与服务端连接后,winsock控件都处于"使用中"的状态,如果你再次进行连接,会再次设置使用的协议,ip地址以及端口,接着再调用winsock控件的CONNECT方法与服务端进行连接。
但是,在已经连接的情况下,并且winsock控件并非是以数组的方法加载,在一个已经连接的winsock控件上,重新设置使用的协议,当然是“不被允许的操作”连接后,比如是按钮,将他的enabled属性设为false,避免这种情况
winsock控件并非是以数组的方法加载,在一个已经连接的winsock控件上,重新设置使用的协议,当然是“不被允许的操作”
------------------------------------------
那么,我可以提供一段代码供楼主参考,关于服务器段用winsock以数组的方法加载。这样的话,无论怎么重新连接,都没有关系。创建Socket多客户服务器
1.设定端口号、开始侦听 2.接收客户连接请求
3.接收、发送数据 4.响应客户关闭、主动关闭连接
设定端口号、开始侦听
我们可以使用控件数组创建多客户服务器,达到多个客户同时连接到服务器。
向窗体增加一个WinSock控件,修改其Name属性为SockServer,修改Index属性为0。
在窗体的Load事件中增加如下代码:
SockServer(0).LocalPort=2000
SockServer(0).Listen
数组控件0始终处于侦听状态。
接收客户连接请求
在ConnectionRequest事件中首先加载一个Socket控件,再用它来接收连接。
Dim SockNum As Integer
SockNum=0
Sub SockServer_ConnectionRequest(...)
SockNum=SockNum+1
Load SockServer(SockNum)
SockServer(SockNum).Accept requestID
End Sub
接收客户发送的数据 和 向客户发送的数据
接收客户发送的数据
在DataArrival事件中将多一个Index参数,用于表示哪一个控件接收到了数据。
Sub SockServer_DataArrival(Index As Integer,ByVal bytesTotal As Long)
Dim s As String
SockServer(Index).GetData s
End Sub
向客户发送的数据
哪一个控件需要发送,只需加上数组下标。
SockServer(n).SendData Text1.Text
响应客户关闭 和 主动关闭连接
响应客户关闭
同样在Close事件中也会增加Index参数表示哪一个连接关闭。
Sub SockServer_Close(Index As Integer)
SockServer(Index).Close
End Sub
主动关闭连接
哪一个连接需要主动关闭,只需增加数组下标。
SockServer(n).Close