今年公司承包了許多大型專案,都是必須用到網路存取技術,例如 圖控軟體我們就必須透過 TCP 協定跟硬體設備溝通,來讀取上萬台工業風扇裝置的轉速、溫度等訊息;再來還有影像監控軟體也是大量用到TCP/UDP、Web API網路協定存取,因此在開發各種軟體時,很多機會勢必需要用到網路通訊的技術。
而這篇教學技術文章,我特別是針對微軟的 Windows 10 平台上,也就是所謂的 Windows 10 通用應用開發(Universal APP,UAP),示範關鍵的程式技術,我想分為 2 篇文章分別介紹 UDP 與 TCP 存取技巧,而這篇文章就先針對 UDP協定來介紹,UDP協定是個無連接(不可靠)的協議,它只提供資料的不可靠傳遞,它一旦把應用程式發給網路層的資料傳送出去,就不保留資料備份(所以UDP有時候也被認為是不可靠的資料報協定),UDP在IP資料報的頭部僅僅加入了復用和資料校驗(欄位),但它相對于TCP 協定來說,資源耗用少、而且處理速度夠快,所以常被用在傳輸要求沒有那麼嚴格的條件下,例如:聊天訊息、網路視訊、語音傳遞。
在 WIndows 10 的 UAP/UWP 平台上,微軟透過一個 DatagramSocket 類別來封裝了所有有關 UDP 網路存取的相關功能。
我將示範 伺服器端(Server) 與 用戶端(Client) 的程式技巧
在 Server 端,主要步驟有
1.建立一個 DatagramSocket 實體物件。
2.建立一個對應的 MessageReceived 事件,它將用來接收 Client 發送的訊息。
3.使用 BindEndPointAsync 方法來綁定本機的位址(IP)、端口(Port),如果是需要本機的所有網路位址(有多張網卡、無線網路等)都可以監聽訊息,我們就改用 BindServiceNameAsync 方法,然後只要指定要擊結對應的Port即可。
而在 Client 端,主要是一樣建立一個 DatagramSocket 實體物件,在透過該 DatagramSocket 提供的 GetOutputSteamAsync() 方法,並在該方法傳入 Server端IP位址、Port即可。
在 XAML 界面我為了好示範,我將 Server 界面跟 Client 界面 放在一起,分別為2個頁籖,這是使用 <Pivot> 元素 (我在這邊不花時間解釋 XAML Code 知識,但開發 Windows 10 XAML 是必備的基本語法,一定要會而且很熟,我就特別喜歡 XAML Code)。
XAML 畫面如下圖
<Pivot>
<PivotItem Header="Server 伺服器端">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel>
<TextBlock Text="Server IP地址:" FontSize="20"/>
<TextBlock Name="tbIp" FontSize="36" IsTextSelectionEnabled="True"/>
</StackPanel>
<ListView Grid.Row="1" Margin="0,15,0,3" Name="lvMsg">
<ListView.Header>
<TextBlock Foreground="LightGreen" Text="已截取的Client端請求" FontSize="20"/>
</ListView.Header>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="6,20">
<TextBlock FontSize="20" Foreground="Yellow">
来自
<Run Text="{Binding Path=FromIP}"/>
的消息:
</TextBlock>
<TextBlock TextWrapping="Wrap" FontSize="24" Text="{Binding Path=Message}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</PivotItem>
<PivotItem Header="Client 端">
<StackPanel>
<TextBox Name="txtServer" Header="Server IP:"/>
<TextBox Name="txtMessage" Header="發送訊息內容:" TextWrapping="Wrap" Height="200"/>
<Button HorizontalAlignment="Center" Content="送出" Padding="20,0" Click="OnSend"/>
</StackPanel>
</PivotItem>
</Pivot>程式運行畫面如下圖
(Server 頁籖)
(Cilent 頁籖)
看完主要的界面宣告與結果,就開始來講解幾個主要核心程式碼
步驟 1.首先我宣告了 1 個常數 servicePort ,用於指定伺服器服務的端口Port.
再宣告 2 個欄位(Fields), 作用於 Server UDP 與 Client UDP。
步驟 2.在 MainPage 建構子,宣告了載入實際時 綁定 Server 與 Client 端的 UDP Socket 。
以及 Unload 時,釋放資源。
還有 我還綁定一個 Server 端要監聽 Client 端發送的訊息請求事件
步驟 3. Server 監聽事件 ,核心程式碼邏輯
相關程式碼,都附上註解
在上述 步驟 1 ~ 步驟 3 ,就完成 Server 端的主要監聽任務。
而 Client 端接下來的邏輯,就是在 Client 頁籖界面,輸入 Server 的 IP 位址、端口,以及要發送的內容,相關程式碼邏輯如下
OnSend() 是在 Client 頁籖界面,執行【送出】按鈕對應的動作方法
以上完成後,讓我們就可以來執行看看
在 Client 端頁籖 輸入訊息內容
在 Server 端監聽到的訊息如下
網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
skype: netqna
line:netqna
微信:netqna
黃先生 Allen
沒有留言:
張貼留言
如您對本文有任何建議或意見,歡迎您留下您寶貴的意見!