[转]vb socket通信(TCP/UDP)一对一、多对一
VB Socket編程(Winsock控件創(chuàng)建TCP/IP客戶機(jī)/服務(wù)器程序)
?
?? Winsock控件建立在TCP、UDP協(xié)議的基礎(chǔ)上,完成與遠(yuǎn)程計(jì)算機(jī)的通信。即使對(duì)TCP/IP不太熟悉的用戶,使用該控件也可以在十幾分鐘內(nèi)創(chuàng)建一 個(gè)簡(jiǎn)單的客戶機(jī)/服務(wù)器程序。下面我們對(duì)Winsock控件的事件、方法、屬性按其在程序中出現(xiàn)的順序分別作詳細(xì)的介紹,以便更好地理解程序源代碼。
下面是Winsock控件的相關(guān)屬性,方法和事件。(略去一些暫用不到的)
*屬性
-------------------------------------------------------------------------
LocalHostName?>
先在一臺(tái)計(jì)算機(jī)上運(yùn)行服務(wù)器程序,此時(shí)窗口上只有一個(gè)“退出”按鈕。 再在另一臺(tái)計(jì)算機(jī)上運(yùn)行客戶機(jī)程序,在“連接”按鈕右邊的文本框中輸入服務(wù)器的主機(jī)名后單擊“連接”按鈕。如果連接成功,則服務(wù)器和客戶機(jī)程序窗口都會(huì)出 現(xiàn)兩個(gè)文本框。這時(shí),兩端都可以在上面的文本框中輸入文字,這些文字會(huì)立即在下面的文本框中出現(xiàn)。
服務(wù)器程序使用的控件如下:
(1)Command1:退出按鈕;
(2)textsend:發(fā)送數(shù)據(jù)文本框;
(3)Winsockserver: 服務(wù)器Winsock;
(4)textget :接收數(shù)據(jù)文本框。
服務(wù)器程序的界面如圖所示。
?
服務(wù)器程序的源代碼如下:
[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??
客戶機(jī)程序使用的控件如下:
(1)Command1:退出按鈕;
(2)Command2:連接按鈕;
(3)Winsockclient:客戶Winsock;
(4)Text1:主機(jī)名文本框;
(5)Textsend:發(fā)送數(shù)據(jù)文本框;
(6)Textget:接收數(shù)據(jù)文本框;
客戶機(jī)程序的源代碼如下:
- ????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 初步
創(chuàng)建 UDP 應(yīng)用程序比創(chuàng)建 TCP 應(yīng)用程序還要簡(jiǎn)單,因?yàn)?UDP 協(xié)議不需要顯式的連接。在上面的 TCP 應(yīng)用程序中,一個(gè) Winsock 控件必須顯式地進(jìn)行“監(jiān)聽”,另一個(gè)必須使用 Connect 方法初始化連接。
UDP 協(xié)議不需要顯式的連接。要在兩個(gè)控件中間發(fā)送數(shù)據(jù),需要完成以下的三步(在連接的雙方):
?
?
因?yàn)閮膳_(tái)計(jì)算機(jī)的地位可以看成“平等的”,這種應(yīng)用程序也被稱為點(diǎn)到點(diǎn)的。為了具體說(shuō)明這個(gè)問題,下面將創(chuàng)建一個(gè)“聊天”應(yīng)用程序,兩個(gè)人可以通過(guò)它進(jìn)行實(shí)時(shí)的交談。
要?jiǎng)?chuàng)建一個(gè) UDP 伙伴,請(qǐng)按照以下步驟執(zhí)行:
?
?
?
?
?
?
要?jiǎng)?chuàng)建第二個(gè) UDP 伙伴,請(qǐng)按照以下步驟執(zhí)行:
?
?
?
?
?
?
如果要試用上面的例子,按 F5 鍵運(yùn)行工程,然后在兩個(gè)窗體的 txtSend TextBox 中分別鍵入一些文本。鍵入的文字將出現(xiàn)在另一個(gè)窗體的 txtOutput TextBox 中。
關(guān)于 Bind 方法
在上面的代碼中,在創(chuàng)建 UDP 應(yīng)用程序時(shí)調(diào)用了 Bind 方法,這是必須的。Bind 方法的作用是為控件“保留”一個(gè)本地端口。例如,如果將控件綁定到 1001 號(hào)端口,那么其它應(yīng)用程序?qū)⒉荒苁褂迷摱丝谶M(jìn)行“監(jiān)聽”。該方法阻止其它應(yīng)用程序使用同樣的端口。
Bind 方法的第二個(gè)參數(shù)是任選的。如果計(jì)算機(jī)上存在多個(gè)網(wǎng)絡(luò)適配器,可以用 LocalIP 參數(shù)來(lái)指定使用哪一個(gè)適配器。如果忽略該參數(shù),控件使用的將是計(jì)算機(jī)上“控制面板”設(shè)置中“網(wǎng)絡(luò)”控制面板對(duì)話框中列出的第一個(gè)適配器。
在使用 UDP 協(xié)議的時(shí)候,可以任意地改變 RemoteHost 和 RemotePort 屬性,同時(shí)始終保持綁定在同一個(gè) LocalPort 上。TCP 協(xié)議與此不同,在改變 RemoteHost 和 RemotePort 屬性之前,必須先關(guān)閉連接。
————————————————————————————————————————————————————————————————————- 以上為介紹,可以有個(gè)大概的了解,也是轉(zhuǎn)載的,不過(guò)當(dāng)時(shí)情況混亂,沒有附鏈接…… 以下為完整的一個(gè)多對(duì)一的TCP通信實(shí)例,感謝原作者的幫助!轉(zhuǎn)自:http://www.cnblogs.com/findw/archive/2012/06/22/2558876.html ————————————————————————————————————————————————————————————————————— [vb]?view plaincopy?
轉(zhuǎn)載于:https://www.cnblogs.com/findw/p/6011917.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的[转]vb socket通信(TCP/UDP)一对一、多对一的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是贵金属合金 具有贵金属的主要特性
- 下一篇: 如何循序渐进有效学习 JavaScrip