雖然我都出過一本網路程式設計的書了,但是要說甚麼網路程式都會作?還是差多了!上面的書裡面我寫了五個單元的UDP通訊範例,但最近替某客戶客製化我的車牌辨識軟體與他們的管理軟體之間的網路通訊機制時,還是被考倒了!
我原本的的UDP功力是知道:UDP像是手持無線電一樣,設定一個頻道(IP + Port)發送訊息出去,不必作連線動作,只要接收端的機器也設定監聽同樣的接收頻道,就可以收到訊息。但是要「回傳」訊息必須原來的發送端開另一個接聽頻道才行!
但是客戶跟我說:他知道很多軟體是用UDP Server的通訊機制,只要客戶端發個訊息給Server,Server就會立即「循原路」立即回傳適當的答案給客戶!亦即發問的客戶不必麻煩設定另一個接聽的頻道來接收回訊,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
執行起來會像這樣:
限會員,要發表迴響,請先登入