VB中利用winsock控件,TCP协议实现多客户端连接

  1 通信程序通常都是采用Client/Server形式。这就要求作为服务器的主机可以同时处理多个客户的请求。因此在编写服务器程序时要添加多个Winsock控件。在开始我们先加入两个Winsock控件。其中一个用来侦听网上请求信号,取名为Listener;另外一个为初始的连接口,取名叫Sock(0)。注意,后一个控件要设为动态数组的形式,以后当客户增多时,可在这个控件基础上动态增加。由于受资源限制,我们在本例中设定最多可以同时接纳15个客户。客户机一般只与一个主机相连,因此程序只须一个Winsock进行连接就足够了。这个程序要用到的控件较少,除了Winsock和Form控件外,只须再添加Commmand控件即可。下面是具体程序和详细注释。 
  2 ****************************** 
  3 '服务器程序 
  4 ****************************** 
  5 Option Explicit 
  6 定义常量 
  7 Const BUSY As Boolean = False 
  8 Const FREE As Boolean = True 
  9 定义连接状态 
 10 Dim ConnectState() As Boolean 
 11 Private Sub Form_Load() 
 12 ReDim Preserve ConnectState(0 To 1
 13 On Error Resume Next 
 14 ConnectState(0) = FREE 
 15 ConnectState(1) = FREE 
 16 '指定网络端口号 
 17 Listener.LocalPort = 1011 
 18 '开始侦听 
 19 Listener.Listen 
 20 End Sub 
 21 Private Sub Listener_ConnectionRequest(ByVal requestID As Long
 22 Dim SockIndex As Integer 
 23 Dim SockNum As Integer 
 24 On Error Resume Next 
 25 Form1.Print requestID & "连接请求" 
 26 '查找连接的用户数 
 27 SockNum = UBound(ConnectState) 
 28 If SockNum > 14 Then 
 29 Form1.Print SockIndex & "" 
 30 Exit Sub 
 31 End If 
 32 '查找空闲的sock 
 33 SockIndex = FindFreeSocket() 
 34 '如果已有的sock都忙,而且sock数不超过15个,动态添加sock 
 35 If SockIndex > SockNum Then 
 36 Load Sock(SockIndex) 
 37 End If 
 38 ConnectState(SockIndex) = BUSY 
 39 Sock(SockIndex).Tag = SockIndex 
 40 '接受请求 
 41 Sock(SockIndex).Accept (requestID) 
 42 Form1.Print SockIndex & "接受请求" 
 43 End Sub 
 44 
 45 '客户断开,关闭相应的sock 
 46 Private Sub Sock_Close(Index As Integer
 47 If Sock(Index).State <> sckClosed Then 
 48 Sock(Index).Close 
 49 End If 
 50 ConnectState(Index) = FREE 
 51 Form1.Print Index & "close" 
 52 End Sub 
 53 
 54 '接收数据 
 55 Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long
 56 Dim dx As Double 
 57 Form1.Print "数据来自" & Index 
 58 Sock(Index).GetData dx, vbDouble 
 59 Form1.Print "dx=" & dx 
 60 End Sub 
 61 
 62 '寻找空闲的sock 
 63 Public Function FindFreeSocket() 
 64 Dim SockCount, i As Integer 
 65 SockCount = UBound(ConnectState) 
 66 For i = 0 To SockCount 
 67 If ConnectState(i) = FREE Then 
 68 FindFreeSocket = i 
 69 Exit Function 
 70 End Ifs 
 71 Next i 
 72 ReDim Preserve ConnectState(0 To SockCount + 1
 73 FindFreeSocket = UBound(ConnectState) 
 74 End Function 
 75 
 76 *************************** 
 77 '客户程序 
 78 ’*************************** 
 79 Option Explicit 
 80 '发送数据 
 81 Private Sub command1_Click() 
 82 Dim dx As Double 
 83 dx = 23.9 
 84 sock.SendData dx 
 85 MsgBox ("data sended"
 86 End Sub 
 87 
 88 Private Sub Form_Load() 
 89 '远程主机名 
 90 sock.RemoteHost = "media2" 
 91 '网络端口 
 92 sock.RemotePort = 1011 
 93 '发出连接命令 
 94 sock.Connect 
 95 Command1.Enabled = False 
 96 End Sub 
 97 
 98 '服务器关闭 
 99 Private Sub sock_Close() 
100 MsgBox ("socket closed"
101 End Sub 
102 
103 '连接成功 
104 Private Sub sock_Connect() 
105 MsgBox ("socket connected"
106 Command1.Enabled = True 
107 End Sub
posted @ 2012-06-22 19:07  御清风  阅读(13689)  评论(0编辑  收藏  举报