怎样在vb中利用winsock控件,tcp协议实现多客户端连接?

像在vb帮助中搜来的代码就不要回了!我的帮助里面也有!!!
2024-11-20 21:22:05
推荐回答(2个)
回答(1):

通信程序通常都是采用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

回答(2):

vb的winsock控件,不好用,浪费了很多时间。往往是断了后再连就连不上。所以后来改了一个思路:用C做多线程的socket,然后做成DLL,供VB调用ApI