日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]vb socket通信(TCP/UDP)一对一、多对一

發(fā)布時(shí)間:2024/10/12 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]vb socket通信(TCP/UDP)一对一、多对一 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ī)程序的源代碼如下:

[vb]?view>False??
  • ????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??
建立多個(gè)客戶端

?

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ù),需要完成以下的三步(在連接的雙方):

  • 將 RemoteHost 屬性設(shè)置為另一臺(tái)計(jì)算機(jī)的名稱。

    ?
  • 將 RemotePort 屬性設(shè)置為第二個(gè)控件的 LocalPort 屬性。

    ?
  • 調(diào)用 Bind 方法,指定使用的 LocalPort。(下面將詳細(xì)地討論該方法。)
  • 因?yàn)閮膳_(tái)計(jì)算機(jī)的地位可以看成“平等的”,這種應(yīng)用程序也被稱為點(diǎn)到點(diǎn)的。為了具體說明這個(gè)問題,下面將創(chuàng)建一個(gè)“聊天”應(yīng)用程序,兩個(gè)人可以通過它進(jìn)行實(shí)時(shí)的交談。

    要?jiǎng)?chuàng)建一個(gè) UDP 伙伴,請(qǐng)按照以下步驟執(zhí)行:

  • 創(chuàng)建一個(gè)新的 Standard EXE 工程。
    ?
  • 將缺省的窗體的名稱修改為 frmPeerA。
    ?
  • 將窗體的標(biāo)題修改為“Peer A”。
    ?
  • 在窗體中放入一個(gè) Winsock 控件,并將其命名為 udpPeerA。
    ?
  • 在“屬性”頁上,單擊“協(xié)議”并將協(xié)議修改為 UDPProtocol。
    ?
  • 在窗體中添加兩個(gè) TextBox 控件。將第一個(gè)命名為 txtSend,第二個(gè)命名為 txtOutput。
    ?
  • 為窗體增加如下的代碼。
  • VBScript code復(fù)制代碼
    Private Sub Form_Load()'控件的名字為 udpPeerAWith udpPeerA'重點(diǎn):必須將 RemoteHost 的值'修改為計(jì)算機(jī)的名字。.RemoteHost = "PeerB".RemotePort = 1001 '連接的端口號(hào)。.Bind 1002 '綁定到本地的端口。End WithfrmPeerB.Show '顯示第二個(gè)窗體。 End SubPrivate Sub txtSend_Change()'在鍵入文本時(shí),立即將其發(fā)送出去。>Text End SubPrivate Sub udpPeerA_DataArrival _(ByVal bytesTotal As Long)Dim strData As String>Text = strData End Sub

    要?jiǎng)?chuàng)建第二個(gè) UDP 伙伴,請(qǐng)按照以下步驟執(zhí)行:

  • 在工程中添加一個(gè)標(biāo)準(zhǔn)窗體。
    ?
  • 將窗體的名字修改為 frmPeerB。
    ?
  • 將窗體的標(biāo)題修改為“Peer B”。
    ?
  • 在窗體中放入一個(gè) Winsock 控件,并將其命名為 udpPeerB。
    ?
  • 在“屬性”頁上,單擊“協(xié)議”并將協(xié)議修改為“UDPProtocol”。
    ?
  • 在窗體上添加兩個(gè) TextBox 控件。將第一個(gè)命名為 txtSend,第二個(gè)命名為 txtOutput。
    ?
  • 在窗體中添加如下的代碼。
  • VBScript code復(fù)制代碼
    Private Sub Form_Load()'控件的名字為 udpPeerB。With udpPeerB'重點(diǎn):必須將 RemoteHost 的值改為'計(jì)算機(jī)的名字。.RemoteHost = "PeerA".RemotePort = 1002 '要連接的端口。.Bind 1001 '綁定到本地的端口上。End With End SubPrivate Sub txtSend_Change()'在鍵入后立即發(fā)送文本。>Text End SubPrivate Sub udpPeerB_DataArrival _(ByVal bytesTotal As Long)Dim strData As String>Text = strData End Sub

    如果要試用上面的例子,按 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ù)來指定使用哪一個(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)載的,不過當(dāng)時(shí)情況混亂,沒有附鏈接…… 以下為完整的一個(gè)多對(duì)一的TCP通信實(shí)例,感謝原作者的幫助!轉(zhuǎn)自:http://www.cnblogs.com/findw/archive/2012/06/22/2558876.html ————————————————————————————————————————————————————————————————————— [vb]?view plaincopy
  • ?1?通信程序通常都是采用Client/Server形式。這就要求作為服務(wù)器的主機(jī)可以同時(shí)處理多個(gè)客戶的請(qǐng)求。因此在編寫服務(wù)器程序時(shí)要添加多個(gè)Winsock控件。在開始我們先加入兩個(gè)Winsock控件。其中一個(gè)用來偵聽網(wǎng)上請(qǐng)求信號(hào),取名為L(zhǎng)istener;另外一個(gè)為初始的連接口,取名叫Sock(0)。注意,后一個(gè)控件要設(shè)為動(dòng)態(tài)數(shù)組的形式,以后當(dāng)客戶增多時(shí),可在這個(gè)控件基礎(chǔ)上動(dòng)態(tài)增加。由于受資源限制,我們?cè)诒纠性O(shè)定最多可以同時(shí)接納15個(gè)客戶。客戶機(jī)一般只與一個(gè)主機(jī)相連,因此程序只須一個(gè)Winsock進(jìn)行連接就足夠了。這個(gè)程序要用到的控件較少,除了Winsock和Form控件外,只須再添加Commmand控件即可。下面是具體程序和詳細(xì)注釋。???
  • ??2?******************************???
  • ??3?'服務(wù)器程序???
  • ??4?******************************???
  • ??5?Option?Explicit???
  • ??6?定義常量???
  • ??7?Const?BUSY?As?Boolean?=?False???
  • ??8?Const?FREE?As?Boolean?=?True???
  • ??9?定義連接狀態(tài)???
  • ?10?Dim?ConnectState()?As?Boolean???
  • ?11?Private?Sub?Form_Load()???
  • ?12?ReDim?Preserve?ConnectState(0?To?1)???
  • ?13?On?Error?Resume?Next???
  • ?14?ConnectState(0)?=?FREE???
  • ?15?ConnectState(1)?=?FREE???
  • ?16?'指定網(wǎng)絡(luò)端口號(hào)???
  • ?17?Listener.LocalPort?=?1011???
  • ?18?'開始偵聽???
  • ?19?Listener.Listen???
  • ?20?End?Sub???
  • ?21?Private?Sub?Listener_ConnectionRequest(ByVal?requestID?As?Long)???
  • ?22?Dim?SockIndex?As?Integer???
  • ?23?Dim?SockNum?As?Integer???
  • ?24?On?Error?Resume?Next???
  • ?25?Form1.Print?requestID?&?"連接請(qǐng)求"???
  • ?26?'查找連接的用戶數(shù)???
  • ?27?SockNum?=?UBound(ConnectState)???
  • ?28?If?SockNum?>?14?Then???
  • ?29?Form1.Print?SockIndex?&?""???
  • ?30?Exit?Sub???
  • ?31?End?If???
  • ?32?'查找空閑的sock???
  • ?33?SockIndex?=?FindFreeSocket()???
  • ?34?'如果已有的sock都忙,而且sock數(shù)不超過15個(gè),動(dòng)態(tài)添加sock???
  • ?35?If?SockIndex?>?SockNum?Then???
  • ?36?Load?Sock(SockIndex)???
  • ?37?End?If???
  • ?38?ConnectState(SockIndex)?=?BUSY???
  • ?39?Sock(SockIndex).Tag?=?SockIndex???
  • ?40?'接受請(qǐng)求???
  • ?41?Sock(SockIndex).Accept?(requestID)???
  • ?42?Form1.Print?SockIndex?&?"接受請(qǐng)求"???
  • ?43?End?Sub???
  • ?44???
  • ?45?'客戶斷開,關(guān)閉相應(yīng)的sock???
  • ?46?Private?Sub?Sock_Close(Index?As?Integer)???
  • ?47?If?Sock(Index).State?<>?sckClosed?Then???
  • ?48?Sock(Index).Close???
  • ?49?End?If???
  • ?50?ConnectState(Index)?=?FREE???
  • ?51?Form1.Print?Index?&?"close"???
  • ?52?End?Sub???
  • ?53???
  • ?54?'接收數(shù)據(jù)???
  • ?55?Private?Sub?Sock_DataArrival(Index?As?Integer,?ByVal?bytesTotal?As?Long)???
  • ?56?Dim?dx?As?Double???
  • ?57?Form1.Print?"數(shù)據(jù)來自"?&?Index???
  • ?58?Sock(Index).GetData?dx,?vbDouble???
  • ?59?Form1.Print?"dx="?&?dx???
  • ?60?End?Sub???
  • ?61???
  • ?62?'尋找空閑的sock???
  • ?63?Public?Function?FindFreeSocket()???
  • ?64?Dim?SockCount,?i?As?Integer???
  • ?65?SockCount?=?UBound(ConnectState)???
  • ?66?For?i?=?0?To?SockCount???
  • ?67?If?ConnectState(i)?=?FREE?Then???
  • ?68?FindFreeSocket?=?i???
  • ?69?Exit?Function???
  • ?70?End?Ifs???
  • ?71?Next?i???
  • ?72?ReDim?Preserve?ConnectState(0?To?SockCount?+?1)???
  • ?73?FindFreeSocket?=?UBound(ConnectState)???
  • ?74?End?Function???
  • ?75???
  • ?76?***************************???
  • ?77?'客戶程序???
  • ?78?’***************************???
  • ?79?Option?Explicit???
  • ?80?'發(fā)送數(shù)據(jù)???
  • ?81?Private?Sub?command1_Click()???
  • ?82?Dim?dx?As?Double???
  • ?83?dx?=?23.9???
  • ?84?sock.SendData?dx???
  • ?85?MsgBox?("data?sended")???
  • ?86?End?Sub???
  • ?87???
  • ?88?Private?Sub?Form_Load()???
  • ?89?'遠(yuǎn)程主機(jī)名???
  • ?90?sock.RemoteHost?=?"media2"???
  • ?91?'網(wǎng)絡(luò)端口???
  • ?92?sock.RemotePort?=?1011???
  • ?93?'發(fā)出連接命令???
  • ?94?sock.Connect???
  • ?95?Command1.Enabled?=?False???
  • ?96?End?Sub???
  • ?97???
  • ?98?'服務(wù)器關(guān)閉???
  • ?99?Private?Sub?sock_Close()???
  • 100?MsgBox?("socket?closed")???
  • 101?End?Sub???
  • 102???
  • 103?'連接成功???
  • 104?Private?Sub?sock_Connect()???
  • 105?MsgBox?("socket?connected")???
  • 106?Command1.Enabled?=?True???
  • 107?End?Sub??
  • 復(fù)制代碼??
  • ?

    轉(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。