「完整案例」基於Socket開發TCP傳輸客戶端

常哥說程式設計發表於2020-08-21

​1 程式介面設計

        TCP客戶端在上位機開發中應用很廣,大多數情況下,上位機軟體都是作為一個TCP客戶端來與PLC或其他伺服器進行通訊的。TCP客戶端的主要功能就是連線伺服器、傳送資料、接收資料、斷開連線,而不同場合的區別在於傳送資料和接收資料的內容不同。

        本案例主要是開發一個TCP客戶端軟體,具備基本的連線功能,並可以傳送ASCII、UTF8等不同格式的字串,也支援傳送16進位制字串傳送,同時支援檔案和JSON格式資料傳送。根據以上功能,設計程式介面如下圖所示:

「完整案例」基於Socket開發TCP傳輸客戶端

2 程式程式碼設計

  • 接收資訊顯示:首先編寫一個接收資訊顯示的方法,這裡是通過ListView來展示接收資訊的。

「完整案例」基於Socket開發TCP傳輸客戶端

  • 連線伺服器:連線伺服器首先例項化Socket物件,然後通過呼叫Connect的方法來實現,連線成功後,開啟一個執行緒來接收伺服器返回的資料,具體程式碼如下:

「完整案例」基於Socket開發TCP傳輸客戶端

  • 斷開連線伺服器:斷開連線伺服器直接呼叫Socket的相關API方法即可。

「完整案例」基於Socket開發TCP傳輸客戶端

  • 接收資料:對於資料接收及解析,由於本案例的客戶端軟體支援多種不同形式資料傳送,那麼接收必然也支援多種形式,那麼對於不同的形式,我們建立了一個列舉型別,這樣方便後續擴充套件,程式碼如下所示:

「完整案例」基於Socket開發TCP傳輸客戶端

  • 因此在資料接收處理時,我們用第一個位元組作為型別判斷,比如第一個位元組如果為0,那麼則認為接收的資料為ASCII字串,也將按照這種形式來進行解析,從第二個位元組開始一直到最後,是有效資料部分,所以資料接收及解析方法如下所示:

「完整案例」基於Socket開發TCP傳輸客戶端

  • 傳送ASCII字串:對於ASCII字串,首先要將傳送的字串按照ASCII的編碼格式轉換成位元組陣列,然後給這個位元組陣列前面增加一個位元組,位元組數值為Message.ASCII,程式碼如下所示:

「完整案例」基於Socket開發TCP傳輸客戶端

  • 傳送檔案:傳送檔案之前首先要選擇檔案,選擇檔案主要使用OpenFileDialog元件,程式碼如下:

「完整案例」基於Socket開發TCP傳輸客戶端

  • 選擇檔案之後,傳送檔案就是將選擇的檔案內容轉換成位元組陣列,然後給這個位元組陣列前面增加一個位元組,位元組數值為Message.File,這裡會傳送兩次,第一次是傳送一個字串,告訴伺服器要傳送的檔名稱,採用的是UTF8編碼,程式碼如下所示:

「完整案例」基於Socket開發TCP傳輸客戶端

  • 傳送JSON資料:JSON資料主要會涉及到實體物件和JSON檔案的轉換,這裡使用Newtonsoft.Json庫編寫了一個JSONHelper的方法,然後需要建立了一個實體物件集合,然後通過EntityToJSON方法轉換成JSON字串,再將JSON字串轉換成位元組陣列,同樣,前面需要增加一個位元組,位元組數值為Message.JSON,程式碼如下:

「完整案例」基於Socket開發TCP傳輸客戶端

3 程式功能除錯

由於TCP伺服器軟體還沒有開發,所以這裡我們使用網路除錯助手來進行功能除錯:

  • 建立連線與斷開連線:

「完整案例」基於Socket開發TCP傳輸客戶端

  • 各種資料型別傳送與接收

「完整案例」基於Socket開發TCP傳輸客戶端

「完整案例」基於Socket開發TCP傳輸客戶端

 

「完整案例」基於Socket開發TCP傳輸客戶端

 

回顧往期內容

 

【西門子】基於PLCSIM-Advanced搭建西門子PLC環境

【西門子】西門子S7通訊協議,你不知道的那些事兒

【OPCUA】C#上位機實現OPCUA通訊案例

【OPCUA】OPCUA+MQTT+阿里雲,能做哪些事兒

【WinCC】C#/.NET聯合WinCC實現資料通訊

【WinCC】手把手教你基於C#開發Wincc語音報警外掛【附原始碼】

【雲APP】基於C#實現手機APP訪問西門子PLC【附原始碼】

 

相關文章