日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

簡(jiǎn)潔實(shí)用Socket框架DotNettySocket


2025年6月19日 19:0 本文熱度 165
轉(zhuǎn)自:寒空飛箭
cnblogs.com/coldairarrow/p/11336771.html


簡(jiǎn)介


DotNettySocket是一個(gè).NET跨平臺(tái)Socket框架(支持.NET4.5+及.NET Standard2.0+),同時(shí)支持TcpSocket、WebSocket和UdpSocket,其基于微軟強(qiáng)大的DotNetty框架,力求為Socket通訊提供簡(jiǎn)單、高效、優(yōu)雅的操作方式。


安裝方式:Nuget安裝DotNettySocket即可


項(xiàng)目地址:https://github.com/Coldairarrow/DotNettySocket


產(chǎn)生背景


兩年前最開(kāi)始接觸物聯(lián)網(wǎng)的時(shí)候,需要用到Tcp及Udp通訊,為了方便使用,將原始的Socket進(jìn)行了簡(jiǎn)單的封裝,基本滿足了需求,并將框架開(kāi)源。


但是由于精力及實(shí)力有限,沒(méi)有進(jìn)一步優(yōu)化原框架。后來(lái)發(fā)現(xiàn)了強(qiáng)大的DotNetty框架,DotNetty是微軟Azure團(tuán)隊(duì)開(kāi)源基于Java Netty框架的移植版,其性能優(yōu)異、維護(hù)團(tuán)隊(duì)強(qiáng)大,許多.NET強(qiáng)大的框架都使用它。


DotNetty功能強(qiáng)大,但是用起來(lái)還是不夠簡(jiǎn)潔(或許是個(gè)人感覺(jué)),剛好最近項(xiàng)目需要用到WebSocket,因此鄙人抽時(shí)間基于DotNetty進(jìn)行簡(jiǎn)單封裝了下,擼出一個(gè)力求簡(jiǎn)單、高效、優(yōu)雅的Socket框架。


使用方式


TcpSocket


Tcp是面向連接的,所以服務(wù)端對(duì)連接的管理就至關(guān)重要,框架支持各種事件的處理、給連接設(shè)置連接名(身份標(biāo)識(shí))、通過(guò)連接名找到特定連接、連接收發(fā)數(shù)據(jù)、分包、粘包處理。


  • 服務(wù)端


using Coldairarrow.DotNettySocket;
using System;
using System.Text;
using System.Threading.Tasks;
namespace TcpSocket.Server
{
   class Program
   {
       static async Task Main(string[] args)
       
{
           var theServer = await SocketBuilderFactory.GetTcpSocketServerBuilder(6001)
               .SetLengthFieldEncoder(2)
               .SetLengthFieldDecoder(ushort.MaxValue, 0, 2, 0, 2)
               .OnConnectionClose((server, connection) =>
               {
                   Console.WriteLine($"連接關(guān)閉,連接名[{connection.ConnectionName}],當(dāng)前連接數(shù):{server.GetConnectionCount()}");
               })
               .OnException(ex =>
               {
                   Console.WriteLine($"服務(wù)端異常:{ex.Message}");
               })
               .OnNewConnection((server, connection) =>
               {
                   connection.ConnectionName = $"名字{connection.ConnectionId}";
                   Console.WriteLine($"新的連接:{connection.ConnectionName},當(dāng)前連接數(shù):{server.GetConnectionCount()}");
               })
               .OnRecieve((server, connection, bytes) =>
               {
                   Console.WriteLine($"服務(wù)端:數(shù)據(jù){Encoding.UTF8.GetString(bytes)}");
                   connection.Send(bytes);
               })
               .OnSend((server, connection, bytes) =>
               {
                   Console.WriteLine($"向連接名[{connection.ConnectionName}]發(fā)送數(shù)據(jù):{Encoding.UTF8.GetString(bytes)}");
               })
               .OnServerStarted(server =>
               {
                   Console.WriteLine($"服務(wù)啟動(dòng)");
               }).BuildAsync();
           Console.ReadLine();
       }
   }
}



  • 客戶端


using Coldairarrow.DotNettySocket;
using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace UdpSocket.Client
{
   class Program
   {
       static async Task Main(string[] args)
       
{
           var theClient = await SocketBuilderFactory.GetUdpSocketBuilder()
               .OnClose(server =>
               {
                   Console.WriteLine($"客戶端關(guān)閉");
               })
               .OnException(ex =>
               {
                   Console.WriteLine($"客戶端異常:{ex.Message}");
               })
               .OnRecieve((server, point, bytes) =>
               {
                   Console.WriteLine($"客戶端:收到來(lái)自[{point.ToString()}]數(shù)據(jù):{Encoding.UTF8.GetString(bytes)}");
               })
               .OnSend((server, point, bytes) =>
               {
                   Console.WriteLine($"客戶端發(fā)送數(shù)據(jù):目標(biāo)[{point.ToString()}]數(shù)據(jù):{Encoding.UTF8.GetString(bytes)}");
               })
               .OnStarted(server =>
               {
                   Console.WriteLine($"客戶端啟動(dòng)");
               }).BuildAsync();
           while (true)
           {
               await theClient.Send(Guid.NewGuid().ToString(), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6003));
               await Task.Delay(1000);
           }
       }
   }
}



WebSocket


WebSocket與TcpSocket接口基本保持一致,僅有的區(qū)別就是TcpSocket支持字節(jié)的收發(fā)并且需要自行處理分包粘包。


而WebSocket直接收發(fā)字符串(UTF-8)編碼,并且無(wú)需考慮分包粘包??蚣苣壳皼](méi)有支持WSS,建議解決方案是使用Nginx轉(zhuǎn)發(fā)即可(相關(guān)資料一搜便有)


  • 服務(wù)端


using Coldairarrow.DotNettySocket;
using System;
using System.Threading.Tasks;
namespace WebSocket.Server
{
   class Program
   {
       static async Task Main(string[] args)
       
{
           var theServer = await SocketBuilderFactory.GetWebSocketServerBuilder(6002)
               .OnConnectionClose((server, connection) =>
               {
                   Console.WriteLine($"連接關(guān)閉,連接名[{connection.ConnectionName}],當(dāng)前連接數(shù):{server.GetConnectionCount()}");
               })
               .OnException(ex =>
               {
                   Console.WriteLine($"服務(wù)端異常:{ex.Message}");
               })
               .OnNewConnection((server, connection) =>
               {
                   connection.ConnectionName = $"名字{connection.ConnectionId}";
                   Console.WriteLine($"新的連接:{connection.ConnectionName},當(dāng)前連接數(shù):{server.GetConnectionCount()}");
               })
               .OnRecieve((server, connection, msg) =>
               {
                   Console.WriteLine($"服務(wù)端:數(shù)據(jù){msg}");
                   connection.Send(msg);
               })
               .OnSend((server, connection, msg) =>
               {
                   Console.WriteLine($"向連接名[{connection.ConnectionName}]發(fā)送數(shù)據(jù):{msg}");
               })
               .OnServerStarted(server =>
               {
                   Console.WriteLine($"服務(wù)啟動(dòng)");
               }).BuildAsync();
           Console.ReadLine();
       }
   }
}



  • 控制臺(tái)客戶端


using Coldairarrow.DotNettySocket;
using System;
using System.Threading.Tasks;

namespace WebSocket.ConsoleClient
{
   class Program
   {
       static async Task Main(string[] args)
       
{
           var theClient = await SocketBuilderFactory.GetWebSocketClientBuilder("127.0.0.1", 6002)
               .OnClientStarted(client =>
               {
                   Console.WriteLine($"客戶端啟動(dòng)");
               })
               .OnClientClose(client =>
               {
                   Console.WriteLine($"客戶端關(guān)閉");
               })
               .OnException(ex =>
               {
                   Console.WriteLine($"異常:{ex.Message}");
               })
               .OnRecieve((client, msg) =>
               {
                   Console.WriteLine($"客戶端:收到數(shù)據(jù):{msg}");
               })
               .OnSend((client, msg) =>
               {
                   Console.WriteLine($"客戶端:發(fā)送數(shù)據(jù):{msg}");
               })
               .BuildAsync();
           while (true)
           {
               await theClient.Send(Guid.NewGuid().ToString());
               await Task.Delay(1000);
           }
       }
   }
}



  • 網(wǎng)頁(yè)客戶端


<!DOCTYPE HTML>
<html>
<head>
   <meta charset="utf-8">
   <title>菜鳥(niǎo)教程(runoob.com)</title>
   <script type="text/javascript">
       function WebSocketTest() {
           if ("WebSocket" in window) {
               var ws = new WebSocket("ws://127.0.0.1:6002");
               ws.onopen = function () {
                   console.log('連上服務(wù)端');
                   setInterval(function () {
                       ws.send("111111");
                   }, 1000);
               };
               ws.onmessage = function (evt) {
                   var received_msg = evt.data;
                   console.log('收到' + received_msg);
               };
               ws.onclose = function () {
                   console.log("連接已關(guān)閉...");
               };
           }
           else {
               alert("您的瀏覽器不支持 WebSocket!");
           }
       }
   </script>

</head>
<body>
   <div id="sse">
       <a href="javascript:WebSocketTest()">運(yùn)行 WebSocket</a>
   </div>
</body>
</html>



UdpSocket


Udp天生便是收發(fā)一體的,以下分為服務(wù)端與客戶端僅僅是為了方便理解


  • 服務(wù)端


using Coldairarrow.DotNettySocket;
using System;
using System.Text;
using System.Threading.Tasks;

namespace UdpSocket.Server
{
   class Program
   {
       static async Task Main(string[] args)
       
{
           var theServer = await SocketBuilderFactory.GetUdpSocketBuilder(6003)
               .OnClose(server =>
               {
                   Console.WriteLine($"服務(wù)端關(guān)閉");
               })
               .OnException(ex =>
               {
                   Console.WriteLine($"服務(wù)端異常:{ex.Message}");
               })
               .OnRecieve((server, point, bytes) =>
               {
                   Console.WriteLine($"服務(wù)端:收到來(lái)自[{point.ToString()}]數(shù)據(jù):{Encoding.UTF8.GetString(bytes)}");
                   server.Send(bytes, point);
               })
               .OnSend((server, point, bytes) =>
               {
                   Console.WriteLine($"服務(wù)端發(fā)送數(shù)據(jù):目標(biāo)[{point.ToString()}]數(shù)據(jù):{Encoding.UTF8.GetString(bytes)}");
               })
               .OnStarted(server =>
               {
                   Console.WriteLine($"服務(wù)端啟動(dòng)");
               }).BuildAsync();
           Console.ReadLine();
       }
   }
}



  • 客戶端


using Coldairarrow.DotNettySocket;
using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace UdpSocket.Client
{
   class Program
   {
       static async Task Main(string[] args)
       
{
           var theClient = await SocketBuilderFactory.GetUdpSocketBuilder()
               .OnClose(server =>
               {
                   Console.WriteLine($"客戶端關(guān)閉");
               })
               .OnException(ex =>
               {
                   Console.WriteLine($"客戶端異常:{ex.Message}");
               })
               .OnRecieve((server, point, bytes) =>
               {
                   Console.WriteLine($"客戶端:收到來(lái)自[{point.ToString()}]數(shù)據(jù):{Encoding.UTF8.GetString(bytes)}");
               })
               .OnSend((server, point, bytes) =>
               {
                   Console.WriteLine($"客戶端發(fā)送數(shù)據(jù):目標(biāo)[{point.ToString()}]數(shù)據(jù):{Encoding.UTF8.GetString(bytes)}");
               })
               .OnStarted(server =>
               {
                   Console.WriteLine($"客戶端啟動(dòng)");
               }).BuildAsync();
           while (true)
           {
               await theClient.Send(Guid.NewGuid().ToString(), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6003));
               await Task.Delay(1000);
           }
       }
   }
}



結(jié)尾


以上所有示例在源碼中都有,希望能夠幫助到大家。


- EOF -


該文章在 2025/6/20 10:33:06 編輯過(guò)
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

天天摸天天干天天日| 又黄又粗的视频| 激情回射一区二区| 激情网亚洲一区| 国产大陆日韩欧美在线观看| 麻豆一区二区在线观看1| 国产欧美AAA一区二区三区| 91国精品国自产在线播放| 夜夜爽夜夜叫夜夜高潮漏水| 欧美视频九九九| 亚洲欧洲国产码专区在线观| 一区二区爽歪歪| 国产精品视频zozo| 殴美午一区二区| 中国成人精品久久久不卡| 国产一区在线激情| 视频激情亚洲| 国产激情在线91成人| 欧美大香蕉免费在线视频| 亚洲国产日韩欧美激情| 国产欧美一区二区在线观看| 国内A级毛片免费看| 高潮动态久久久| 欧美日韩女同一区二区三区四区| 日韩欧美一级爱c视频| 午夜AAA片一区二区专区| 国产伦精品一区二区妓花| 看日本免费操逼| 久久久美女裸按摩| 欧美一级一级一区三区| 国产一区二区ah 0| 人人看人人草人人澡| 久久麻豆精彩视频| 人人妻人人澡人人爽不卡视频| 久久久男女日b视频| 夜夜操夜夜操操操操| 国产欧美一区二区三区户外| 欧美亚洲日韩13页| 古代级毛片久久麻豆| 亚洲色图综合在线视频| 亚洲成人综合色情视频网站|