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

被折叠的 条评论
为什么被折叠?



