vb中利用winsock控件,tcp協議實現多客戶端連接
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
通信程序通常都是采用Client/Server形式。這就要求作為服務器的主機可以同時處理多個客戶的請求。因此在編寫服務器程序時要添加多個Winsock控件。在開始我們先加入兩個Winsock控件。其中一個用來偵聽網上請求信號,取名為Listener;另外一個為初始的連接口,取名叫Sock(0)。注意,后一個控件要設為動態數組的形式,以后當客戶增多時,可在這個控件基礎上動態增加。由于受資源限制,我們在本例中設定最多可以同時接納15個客戶??蛻魴C一般只與一個主機相連,因此程序只須一個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 該文章在 2013/12/10 22:12:03 編輯過 |
關鍵字查詢
相關文章
正在查詢... |