[转]vb socket通信(TCP/UDP)一对一、多对一
VB Socket編程(Winsock控件創建TCP/IP客戶機/服務器程序)
?
?? Winsock控件建立在TCP、UDP協議的基礎上,完成與遠程計算機的通信。即使對TCP/IP不太熟悉的用戶,使用該控件也可以在十幾分鐘內創建一 個簡單的客戶機/服務器程序。下面我們對Winsock控件的事件、方法、屬性按其在程序中出現的順序分別作詳細的介紹,以便更好地理解程序源代碼。
下面是Winsock控件的相關屬性,方法和事件。(略去一些暫用不到的)
*屬性
-------------------------------------------------------------------------
LocalHostName?>
先在一臺計算機上運行服務器程序,此時窗口上只有一個“退出”按鈕。 再在另一臺計算機上運行客戶機程序,在“連接”按鈕右邊的文本框中輸入服務器的主機名后單擊“連接”按鈕。如果連接成功,則服務器和客戶機程序窗口都會出 現兩個文本框。這時,兩端都可以在上面的文本框中輸入文字,這些文字會立即在下面的文本框中出現。
服務器程序使用的控件如下:
(1)Command1:退出按鈕;
(2)textsend:發送數據文本框;
(3)Winsockserver: 服務器Winsock;
(4)textget :接收數據文本框。
服務器程序的界面如圖所示。
?
服務器程序的源代碼如下:
[vb]?view>False??- ????textget.Visible?=?False??
- ????Winsockserver.LocalPort?=?1001??
- ????Winsockserver.Listen??
- End?Sub??
- ??
- Private?Sub?textsend_Change()??
- ????Winsockserver.SendData?textsend.Text??
- End?Sub??
- Private?Sub?Winsockserver_Close()??
- ????Winsockserver.Close??
- ????End??
- End?Sub??
- ??
- Private?Sub?Winsockserver_ConnectionRequest(ByVal?requestID?As?Long)??
- ????textsend.Visible?=?True??
- ????textget.Visible?=?True??
- ????If?Winsockserver.State?<>?sckClosed?Then?Winsockserver.Close??
- ????Winsockserver.Accept?requestID??
- End?Sub??
- ??
- Private?Sub?Winsockserver_DataArrival(ByVal?bytesTotal?As?Long)??
- ????Dim?tmpstr?As?String??
- ??????
- ????Winsockserver.GetData?tmpstr??
- ????textget.Text?=?tmpstr??
- End?Sub??
客戶機程序使用的控件如下:
(1)Command1:退出按鈕;
(2)Command2:連接按鈕;
(3)Winsockclient:客戶Winsock;
(4)Text1:主機名文本框;
(5)Textsend:發送數據文本框;
(6)Textget:接收數據文本框;
客戶機程序的源代碼如下:
- ????textget.Visible?=?False??
- ????Winsockclient.RemotePort?=?1001??
- ????Winsockclient.RemoteHost?=?"sccdsz"??
- End?Sub??
- Private?Sub?Text1_Change()??
- ????Winsockclient.RemoteHost?=?Text1.Text??
- End?Sub??
- Private?Sub?textsend_Change()??
- ????Winsockclient.SendData?textsend.Text??
- End?Sub??
- Private?Sub?Winsockclient_Close()??
- ????Winsockclient.Close??
- ????End??
- End?Sub??
- Private?Sub?winsockclient_Connect()??
- ????textsend.Visible?=?True??
- ????textget.Visible?=?True??
- ????Command2.Visible?=?False??
- End?Sub??
- Private?Sub?winsockclient_DataArrival(ByVal?bytesTotal?As?Long)??
- ????Dim?tmpstr?As?String??
- ????Winsockclient.GetData?tmpstr??
- ????textget.Text?=?tmpstr??
- End?Sub??
?
Private intMax As LongPrivate Sub Form_Load()intMax = 0sckServer(0).LocalPort = 1001sckServer(0).Listen End SubPrivate Sub sckServer_ConnectionRequest _ (Index As Integer, ByVal requestID As Long)If Index = 0 ThenintMax = intMax + 1Load sckServer(intMax)sckServer(intMax).LocalPort = 0sckServer(intMax).Accept requestIDLoad txtData(intMax)End If End Sub?
?
?
?
UDP 初步
創建 UDP 應用程序比創建 TCP 應用程序還要簡單,因為 UDP 協議不需要顯式的連接。在上面的 TCP 應用程序中,一個 Winsock 控件必須顯式地進行“監聽”,另一個必須使用 Connect 方法初始化連接。
UDP 協議不需要顯式的連接。要在兩個控件中間發送數據,需要完成以下的三步(在連接的雙方):
?
?
因為兩臺計算機的地位可以看成“平等的”,這種應用程序也被稱為點到點的。為了具體說明這個問題,下面將創建一個“聊天”應用程序,兩個人可以通過它進行實時的交談。
要創建一個 UDP 伙伴,請按照以下步驟執行:
?
?
?
?
?
?
要創建第二個 UDP 伙伴,請按照以下步驟執行:
?
?
?
?
?
?
如果要試用上面的例子,按 F5 鍵運行工程,然后在兩個窗體的 txtSend TextBox 中分別鍵入一些文本。鍵入的文字將出現在另一個窗體的 txtOutput TextBox 中。
關于 Bind 方法
在上面的代碼中,在創建 UDP 應用程序時調用了 Bind 方法,這是必須的。Bind 方法的作用是為控件“保留”一個本地端口。例如,如果將控件綁定到 1001 號端口,那么其它應用程序將不能使用該端口進行“監聽”。該方法阻止其它應用程序使用同樣的端口。
Bind 方法的第二個參數是任選的。如果計算機上存在多個網絡適配器,可以用 LocalIP 參數來指定使用哪一個適配器。如果忽略該參數,控件使用的將是計算機上“控制面板”設置中“網絡”控制面板對話框中列出的第一個適配器。
在使用 UDP 協議的時候,可以任意地改變 RemoteHost 和 RemotePort 屬性,同時始終保持綁定在同一個 LocalPort 上。TCP 協議與此不同,在改變 RemoteHost 和 RemotePort 屬性之前,必須先關閉連接。
————————————————————————————————————————————————————————————————————- 以上為介紹,可以有個大概的了解,也是轉載的,不過當時情況混亂,沒有附鏈接…… 以下為完整的一個多對一的TCP通信實例,感謝原作者的幫助!轉自:http://www.cnblogs.com/findw/archive/2012/06/22/2558876.html ————————————————————————————————————————————————————————————————————— [vb]?view plaincopy?
轉載于:https://www.cnblogs.com/findw/p/6011917.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的[转]vb socket通信(TCP/UDP)一对一、多对一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是贵金属合金 具有贵金属的主要特性
- 下一篇: case的执行顺序 嵌套使用