建立TCP服務端

来源:https://www.cnblogs.com/kjgagaga/archive/2022/09/06/16661710.html
-Advertisement-
Play Games

利用Socket建立TCP服務端。 項目要求:建立一個TCP服務端,接收機器人發送過來的實時數據。機器人會一直嘗試連接一個IP地址埠號,連接上之後就會將數據報文發送過來。服務端要根據報文格式對數據進行解析。當發送過來的數據報文不符合格式的時候,斷開Socket連接。 主要代碼: public Ro ...


利用Socket建立TCP服務端。

項目要求:建立一個TCP服務端,接收機器人發送過來的實時數據。機器人會一直嘗試連接一個IP地址埠號,連接上之後就會將數據報文發送過來。服務端要根據報文格式對數據進行解析。當發送過來的數據報文不符合格式的時候,斷開Socket連接。

主要代碼:

        public Robot_Method(Robot_Device _Device)
        {
            Device = _Device;
        }
        private Robot_Device Device;//設備實體類
        private Socket Socket = null;//服務端Socket。
        private Socket ClientSocket = null;//客戶端Socket
        Thread th;//接收數據線程
        //接收數據事件
        public Action<string> recvMessageEvent = null;
       
        public void Connect()
        {
            Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress Localhost = IPAddress.Any;
            int LocalPort = Device.Device_Port;
            IPEndPoint endPoint = new IPEndPoint(Localhost, LocalPort);//服務端需要開啟的網路終結點。客戶端鏈接這個IP地址和埠號。
            Socket.Bind(endPoint);//綁定網路終結點
            Socket.Listen(1);
            Thread th = new Thread(ListenClientConnect);//開啟線程來等待客戶端連接。
            th.IsBackground = true;
            th.Start();
        }
        public void DisConnect()
        {
            Socket.Close();//關閉服務端
        }

        public void ListenClientConnect()
        {
            while (true)
            {
                ClientSocket = Socket.Accept();//等待客戶端連接。
                th?.Abort();//如果接收數據線程不為空,則終止它。
                th = new Thread(ReceiveMessage);//開啟接收數據線程。
                th.IsBackground = true;
                th.Start();
            }
        }

        public void ReceiveMessage()
        {
            while (true)
            {
                string ErrorMessage = "";
                try
                {
                    byte[] vs = new byte[1024];
                    int lenght = ClientSocket.Receive(vs);
                    if (lenght == 177)
                    {
                        if (vs[0] != 0xFE && vs[1] != 0x5A && vs[2] != 0xA5)
                        {
                            ErrorMessage = "報文頭錯誤";
                            recvMessageEvent?.Invoke(ErrorMessage);
                            ClientSocket.Close();
                            break;
                        }
                        else
                        {
                            Device.Device_State = true;
                            GetResult(vs);//處理接收的報文數據
                            ErrorMessage = "";//當ErrorMessage為""時,表示接收數據報文成功,且解析成功。通過事件通知數據已經處理完成。
                            recvMessageEvent?.Invoke(ErrorMessage);
                        }
                    }
                    else
                    {
                        Device.Device_State = false;
                        ErrorMessage = "收到的長度不是規定的報文長度:177";
                        recvMessageEvent?.Invoke(ErrorMessage);
                        ClientSocket.Close();
                        break;
                    }
                }
                catch (Exception ex)
                {
                    Device.Device_State = false;
                    ErrorMessage = ex.Message;
                    recvMessageEvent?.Invoke(ErrorMessage);
                    ClientSocket.Close();
                    break;
                } 
            }
        }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.什麼是request對象 在django中,當一個頁面被請求時,Django就會創建一個包含本次請求原信息的HttpRequest對象;Django會將這個對象自動傳遞給響應的視圖函數,一般視圖函數約定俗成地使用 request 參數承接這個對象。 2.request對象的作用 request對 ...
  • “JVM 為什麼使用元空間替換了永久代?” 這是一個工作6年的同學去位元組第一面遇到的問題,很遺憾,他沒有回答出來 大家好,我是Mic,一個工作了14年的Java程式員。 關於這個問題,我們怎麼回答?面試官到底關註什麼呢? 面試解析 我們都知道Java8以及以後的版本中,JVM運行時數據區的結構都在慢 ...
  • C++ Primer學習筆記:string、vector、迭代器以及數組,只記錄不會或不熟悉的地方 博客小站:blog.smartdog.top 命名空間 std::cin 使用標準輸入輸出命名空間,:: 域操作符表示:編譯器應從操作符左側名字所示的作用域中尋找右側那個名字。 使用 using 可以 ...
  • 來源 | Info ,整理 | 鈺瑩、Tina 回擊就代表輸了?! 今年年中,一位前谷歌、前亞馬遜的工程師推出了他創作的開源記憶體數據緩存系統 Dragonfly,用 C/C++ 編寫,基於 BSL 許可(Business Source License)分發。 根據過往的基準測試結果來看, Drago ...
  • 項目中一個常見的場景,就是介面請求或者響應參數中會有一些欄位的取值會限定為固定幾個可選值,而在代碼中這些可選值會通過枚舉類來承載,本文探討下如何讓swagger介面文檔中自動加上欄位的取值含義說明,解放生產力。 ...
  • 數組元素固定,在 Go 語言中沒有那麼常用,更常用的數據結構是切片。什麼是切片呢? 切片就是動態的數組,它的長度不固定,可以隨意向切片中追加元素,而且切片會在容量不足的時候自動擴容。切片(slice)是對數組一個連續片段的引用,這個片段可以是整個數組,或者是由起始和終止索引標識的一些項的子集,需要註 ...
  • 什麼是性能測試 在軟體開發中,性能測試是一種常見的測試實踐,用於確定系統在特定工作負載下的響應能力和穩定性表現。它還用於排查,觀察,驗證系統在其他方面的質量。例如可擴展性,可靠性和資源使用情況。 性能測試是測試工程的一個子集,是一種電腦科學實踐,致力於將性能指標構建在系統的設計,實現和架構中。 相 ...
  • 在上個月寫過一篇 .NET 純原生實現 Cron 定時任務執行,未依賴第三方組件 的文章,當時 CronSchedule 的實現是使用了,每個服務都獨立進入到一個 while 迴圈中,進行定期掃描是否到了執行時間來實現的,但是那個邏輯有些問題,經過各位朋友的測試,發現當多個任務的時候存在一定概率不按 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...