vb中的 winsock如何实现监听功能和连接功能

本文介绍了一种基于Winsock的Client/Server架构通信程序设计方法。该程序能够实现服务器端同时处理多个客户端请求,并通过动态增加Winsock控件来支持最多15个并发连接。此外,还详细介绍了服务器端如何接受连接请求、处理数据接收及客户端断开连接的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通信程序通常都是采用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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值