Contents ...
udn網路城邦
教你作一個VB.NET版的UDP Server
2017/11/03 08:52
瀏覽6,609
迴響1
推薦6
引用0

雖然我都出過一本網路程式設計的書了,但是要說甚麼網路程式都會作?還是差多了!上面的書裡面我寫了五個單元的UDP通訊範例,但最近替某客戶客製化我的車牌辨識軟體與他們的管理軟體之間的網路通訊機制時,還是被考倒了!

我原本的的UDP功力是知道:UDP像是手持無線電一樣,設定一個頻道(IP + Port)發送訊息出去,不必作連線動作,只要接收端的機器也設定監聽同樣的接收頻道,就可以收到訊息。但是要「回傳」訊息必須原來的發送端開另一個接聽頻道才行

但是客戶跟我說:他知道很多軟體是用UDP Server的通訊機制,只要客戶端發個訊息給ServerServer就會立即「循原路」立即回傳適當的答案給客戶!亦即發問的客戶不必麻煩設定另一個接聽的頻道來接收回訊,Server可以直接從接收的來訊就知道該回傳到哪裡?

哇!機制是很棒,可以簡化程式,但我之前沒作過!一如預期的,我還是可以從網路上找到範例,但是也一如預期的,絕對找不到VB版的範例,一定是C++C#的(https://stackoverflow.com/questions/20038943/simple-udp-example-to-send-and-receive-data-from-same-socket)。VB好像有點被看低的台語,公開演講用台語就有點怪?連民進黨超愛本土的總統也不太用台語(或客語)作公開演講的!哈哈!

但是不好意思,我的程式母語就是VB!連開發影像辨識核心都是用VB寫的,只有必要時為了遷移到不同作業平台才會心不干情不願的翻譯成C語言。這下子有點尷尬了,我不可能為了要作通訊告知外部程式車號多少?就將整個VB寫的軟體改成C語言啊?那可是要忙個三五天的!而且以後要改寫程式的話,老實說寫C語言程式,對我來說就像說英語,不是不會但就是不夠溜嘛!

所以當然是C#UDP程式入境隨俗,跟著我講「台語」囉!C#被改成VB了!哈哈!既然都寫好了,就弄個問時間的UDP Server範例給大家分享,以後要作UDP Server也有VB版可以參考了!

Server端開個視窗專案,程式碼寫這樣:

Imports System.Net         '網路基礎功能相關函數

Imports System.Net.Sockets '網路連線功能相關函數

Imports System.Text        '文字編碼功能相關函數 

Public Class Form1 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        Me.Show()

        Dim U As New UdpClient(2017)

        Do While True

            Dim EP As New IPEndPoint(IPAddress.Any, 2017) '建立監聽端點資訊

            Dim B() As Byte = U.Receive(EP)

            Dim A As String = Encoding.Default.GetString(B) '翻譯資訊為字串

            Dim M As String = "Unknown Command"

            If A = "Time?" Then

                M = Now.ToString

            End If

            B = Encoding.Default.GetBytes(M)

            U.Send(B, B.Length, EP) '回應詢問資料

        Loop

    End Sub

End Class

Client端也開個視窗程式,介面與程式碼如下:

Imports System.Net         '網路基礎功能相關函數

Imports System.Net.Sockets '網路連線功能相關函數

Imports System.Text        '文字編碼功能相關函數 

Public Class Form1 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim C As New UdpClient

        Dim EP As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 2017) '應為目標程式所在之IP

        C.Connect(EP)

        Dim B() As Byte = Encoding.Default.GetBytes(TextBox1.Text)

        C.Send(B, B.Length)

        Dim R() As Byte = C.Receive(EP)

        TextBox2.Text = Encoding.Default.GetString(R)

    End Sub

End Class

執行起來會像這樣:

有誰推薦more
全站分類:心情隨筆 校園筆記
自訂分類:教育學習

限會員,要發表迴響,請先登入
迴響(1) :
1樓. 美國番媽
2017/11/03 16:56


Love and hugs from Washington DC!.