vb中利用winsock控件,tcp协议实现多客户端连接
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
通信程序通常都是采用Client/Server形式。这就要求作为服务器的主机可以同时处理多个客户的请求。因此在编写服务器程序时要添加多个Winsock控件。在开始我们先加入两个Winsock控件。其中一个用来侦听网上请求信号,取名为Listener;另外一个为初始的连接口,取名叫Sock(0)。注意,后一个控件要设为动态数组的形式,以后当客户增多时,可在这个控件基础上动态增加。由于受资源限制,我们在本例中设定最多可以同时接纳15个客户。客户机一般只与一个主机相连,因此程序只须一个Winsock进行连接就足够了。这个程序要用到的控件较少,除了Winsock和Form控件外,只须再添加Commmand控件即可。下面是具体程序和详细注释。 ****************************** 服务器程序 ****************************** Option Explicit 定义常量 Const BUSY As Boolean = False Const FREE As Boolean = True 定义连接状态 Dim ConnectState() As Boolean Private Sub Form_Load() ReDim Preserve ConnectState(0 To 1) On Error Resume Next ConnectState(0) = FREE ConnectState(1) = FREE ’指定网络端口号 Listener.LocalPort = 1011 ‘开始侦听 Listener.Listen End Sub Private Sub Listener_ConnectionRequest(ByVal requestID As Long) Dim SockIndex As Integer Dim SockNum As Integer On Error Resume Next Form1.Print requestID & "连接请求" 查找连接的用户数 SockNum = UBound(ConnectState) If SockNum > 14 Then Form1.Print SockIndex & "" Exit Sub End If 查找空闲的sock SockIndex = FindFreeSocket() ’如果已有的sock都忙,而且sock数不超过15个,动态添加sock If SockIndex > SockNum Then Load Sock(SockIndex) End If ConnectState(SockIndex) = BUSY Sock(SockIndex).Tag = SockIndex 接受请求 Sock(SockIndex).Accept (requestID) Form1.Print SockIndex & "接受请求" End Sub 客户断开,关闭相应的sock Private Sub Sock_Close(Index As Integer) If Sock(Index).State <> sckClosed Then Sock(Index).Close End If ConnectState(Index) = FREE Form1.Print Index & "close" End Sub 接收数据 Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim dx As Double Form1.Print "数据来自" & Index Sock(Index).GetData dx, vbDouble Form1.Print "dx=" & dx End Sub 寻找空闲的sock Public Function FindFreeSocket() Dim SockCount, i As Integer SockCount = UBound(ConnectState) For i = 0 To SockCount If ConnectState(i) = FREE Then FindFreeSocket = i Exit Function End Ifs Next i ReDim Preserve ConnectState(0 To SockCount + 1) FindFreeSocket = UBound(ConnectState) End Function *************************** 客户程序 ’*************************** Option Explicit 发送数据 Private Sub command1_Click() Dim dx As Double dx = 23.9 sock.SendData dx MsgBox ("data sended") End Sub Private Sub Form_Load() 远程主机名 sock.RemoteHost = "media2" 网络端口 sock.RemotePort = 1011 发出连接命令 sock.Connect Command1.Enabled = False End Sub 服务器关闭 Private Sub sock_Close() MsgBox ("socket closed") End Sub 连接成功 Private Sub sock_Connect() MsgBox ("socket connected") Command1.Enabled = True End Sub 该文章在 2013/12/10 22:12:03 编辑过 |
关键字查询
相关文章
正在查询... |