DotNettySocket是一个.NET跨平台Socket框架(支持.NET4.5+及.NET Standard2.0+),同时支持TcpSocket、WebSocket和UdpSocket,其基于微软强大的DotNetty框架,力求为Socket通信提供简单、高效、优雅的操做方式。javascript
安装方式:Nuget安装DotNettySocket便可html
项目地址:https://github.com/Coldairarrow/DotNettySocketjava
两年前最开始接触物联网的时候,须要用到Tcp及Udp通信,为了方便使用,将原始的Socket进行了简单的封装,基本知足了需求,并将框架开源。可是因为精力及实力有限,没有进一步优化原框架。后来发现了强大的DotNetty框架,DotNetty是微软Azure团队开源基于Java Netty框架的移植版,其性能优异、维护团队强大,许多.NET强大的框架都使用它。DotNetty功能强大,可是用起来仍是不够简洁(或许是我的感受),恰好最近项目须要用到WebSocket,所以鄙人抽时间基于DotNetty进行简单封装了下,撸出一个力求简单、高效、优雅的Socket框架。git
Tcp是面向链接的,因此服务端对链接的管理就相当重要,框架支持各类事件的处理、给链接设置链接名(身份标识)、经过链接名找到特定链接、链接收发数据、分包、粘包处理。github
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($"链接关闭,链接名[{connection.ConnectionName}],当前链接数:{server.GetConnectionCount()}"); }) .OnException(ex => { Console.WriteLine($"服务端异常:{ex.Message}"); }) .OnNewConnection((server, connection) => { connection.ConnectionName = $"名字{connection.ConnectionId}"; Console.WriteLine($"新的链接:{connection.ConnectionName},当前链接数:{server.GetConnectionCount()}"); }) .OnRecieve((server, connection, bytes) => { Console.WriteLine($"服务端:数据{Encoding.UTF8.GetString(bytes)}"); connection.Send(bytes); }) .OnSend((server, connection, bytes) => { Console.WriteLine($"向链接名[{connection.ConnectionName}]发送数据:{Encoding.UTF8.GetString(bytes)}"); }) .OnServerStarted(server => { Console.WriteLine($"服务启动"); }).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($"客户端关闭"); }) .OnException(ex => { Console.WriteLine($"客户端异常:{ex.Message}"); }) .OnRecieve((server, point, bytes) => { Console.WriteLine($"客户端:收到来自[{point.ToString()}]数据:{Encoding.UTF8.GetString(bytes)}"); }) .OnSend((server, point, bytes) => { Console.WriteLine($"客户端发送数据:目标[{point.ToString()}]数据:{Encoding.UTF8.GetString(bytes)}"); }) .OnStarted(server => { Console.WriteLine($"客户端启动"); }).BuildAsync(); while (true) { await theClient.Send(Guid.NewGuid().ToString(), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6003)); await Task.Delay(1000); } } } }
WebSocket与TcpSocket接口基本保持一致,仅有的区别就是TcpSocket支持字节的收发而且须要自行处理分包粘包。而WebSocket直接收发字符串(UTF-8)编码,而且无需考虑分包粘包。框架目前没有支持WSS,建议解决方案是使用Nginx转发便可(相关资料一搜便有)web
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($"链接关闭,链接名[{connection.ConnectionName}],当前链接数:{server.GetConnectionCount()}"); }) .OnException(ex => { Console.WriteLine($"服务端异常:{ex.Message}"); }) .OnNewConnection((server, connection) => { connection.ConnectionName = $"名字{connection.ConnectionId}"; Console.WriteLine($"新的链接:{connection.ConnectionName},当前链接数:{server.GetConnectionCount()}"); }) .OnRecieve((server, connection, msg) => { Console.WriteLine($"服务端:数据{msg}"); connection.Send(msg); }) .OnSend((server, connection, msg) => { Console.WriteLine($"向链接名[{connection.ConnectionName}]发送数据:{msg}"); }) .OnServerStarted(server => { Console.WriteLine($"服务启动"); }).BuildAsync(); Console.ReadLine(); } } }
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($"客户端启动"); }) .OnClientClose(client => { Console.WriteLine($"客户端关闭"); }) .OnException(ex => { Console.WriteLine($"异常:{ex.Message}"); }) .OnRecieve((client, msg) => { Console.WriteLine($"客户端:收到数据:{msg}"); }) .OnSend((client, msg) => { Console.WriteLine($"客户端:发送数据:{msg}"); }) .BuildAsync(); while (true) { await theClient.Send(Guid.NewGuid().ToString()); await Task.Delay(1000); } } } }
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(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('连上服务端'); setInterval(function () { ws.send("111111"); }, 1000); }; ws.onmessage = function (evt) { var received_msg = evt.data; console.log('收到' + received_msg); }; ws.onclose = function () { console.log("链接已关闭..."); }; } else { alert("您的浏览器不支持 WebSocket!"); } } </script> </head> <body> <div id="sse"> <a href="javascript:WebSocketTest()">运行 WebSocket</a> </div> </body> </html>
Udp天生即是收发一体的,如下分为服务端与客户端仅仅是为了方便理解c#
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($"服务端关闭"); }) .OnException(ex => { Console.WriteLine($"服务端异常:{ex.Message}"); }) .OnRecieve((server, point, bytes) => { Console.WriteLine($"服务端:收到来自[{point.ToString()}]数据:{Encoding.UTF8.GetString(bytes)}"); server.Send(bytes, point); }) .OnSend((server, point, bytes) => { Console.WriteLine($"服务端发送数据:目标[{point.ToString()}]数据:{Encoding.UTF8.GetString(bytes)}"); }) .OnStarted(server => { Console.WriteLine($"服务端启动"); }).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($"客户端关闭"); }) .OnException(ex => { Console.WriteLine($"客户端异常:{ex.Message}"); }) .OnRecieve((server, point, bytes) => { Console.WriteLine($"客户端:收到来自[{point.ToString()}]数据:{Encoding.UTF8.GetString(bytes)}"); }) .OnSend((server, point, bytes) => { Console.WriteLine($"客户端发送数据:目标[{point.ToString()}]数据:{Encoding.UTF8.GetString(bytes)}"); }) .OnStarted(server => { Console.WriteLine($"客户端启动"); }).BuildAsync(); while (true) { await theClient.Send(Guid.NewGuid().ToString(), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6003)); await Task.Delay(1000); } } } }
以上全部示例在源码中都有,若以为不错请点赞加星星,但愿可以帮助到你们。浏览器
有任何问题请及时反馈或加群交流websocket
QQ群1:(已满)框架
QQ群2:579202910