用VB寫的一個簡單的服務端程序,
服務器端程序:
Private Sub Form_Load()
tcpserver.LocalPort = 1001 '將 LocalPort 屬性設置為一個整數。
tcpserver.Listen '然后調用 Listen 方法。
End Sub
Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
If tcpserver.State <> sckClosed Then tcpserver.Close '檢查控件的 State 屬性是否為關閉的。 '如果不是, '在接受新的連接之前先關閉此連接。
tcpserver.Accept requestID '接受具有 requestID 參數的 '連接。
msgbox("有人連接服務端")
End Sub
客服端程序
Private Sub Form_Load()
tcpClient.RemoteHost = "192.168.1.2"
tcpClient.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click() '連接按鈕
tcpClient.Connect
MsgBox ("連接服務器成功")
End Sub
運行后,啟動服務端,然后啟動客戶端,點“連接”按鈕,客服端端跳出窗口“連接服務器成功”,服務端跳出窗口“有人連接服務端”。表示雙方建立了連接。這個時候關閉客戶端,然后再啟動,點“連接”按鈕,就只是跳出連接服務器成功(程序設置不完美)。然后在輸入框中輸入向服務端發(fā)送數據,出現“錯誤“40006” 所需事物請求的錯誤協(xié)議連接或連接狀態(tài)”。這個時候發(fā)現第二次連接就不行,看來服務端只是支持單個連接,第二次連接相當于,第二個連接,就找不到服務器,這個錯誤跟沒有啟動服務端程序的錯誤是一樣,說明客戶端找不到服務端。
解決辦法:創(chuàng)建控件數組
上面設計的基本服務器只能接受一個連接請求。通過創(chuàng)建控件數組,使用一個控件也可以同時接受多個連接請求。利用這種方法,不需要關閉連接,而只需創(chuàng)建新的控件實例(通過設置其索引屬性),然后在新的實例上調用 Accept 方法。
下面的代碼假定名為 sckServer 的窗體上有一個 Winsock 控件,它的 Index 屬性被設置為 0;因此控件是控件數組的一部分。在聲明部分,聲明了一個模塊級的變量 intMax。在窗體的 Load 事件中,intMax 被設置為 0,數組中第一個控件的 LocalPort 屬性被設置為 1001。然后調用控件的 Listen 方法,使之成為“監(jiān)聽”控件。在連接請求到達時,代碼將檢測 Index 是否為 0(“監(jiān)聽”控件的值)。如果為 0,監(jiān)聽控件將增加 intMax 的值,并使用該號碼來創(chuàng)建新的控件實例。然后,使用新的控件實例接受連接請求。
Private intMax As Long
Private Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 1001
sckServer(0).Listen
End Sub
Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
End If
End Sub
下面涉及到sckServer的地方全部用上 sckServer(intMax),就可以了
這樣即使客戶端重新啟動,一樣可以連接到服務端。
該文章在 2013/12/11 8:54:48 編輯過