zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    IE8上传插件jquery-form.js上传请求参数设置type为post失效问题
    路径参数汉字兼容问题
    vue-cli2移动端适配
    事件委托原生、jQuery实现
    new Date()在移动端的问题
    create-react-app配置less
    删除左右两边空格
    日期转换
    Git 常用命令
    单页面应用
  • 原文地址:https://www.cnblogs.com/findw/p/2558876.html
Copyright © 2011-2022 走看看