# DotNetty **Repository Path**: amane-10/dot-netty ## Basic Information - **Project Name**: DotNetty - **Description**: 自己封装了一个DotNetty,下载下来,加到工程里即可使用,不需要繁杂的操作,会调用函数就能使用,这玩意是 .net6.0的 - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2022-12-08 - **Last Updated**: 2024-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DotNetty #### 介绍 自我封装的DotNetty,也就那样吧,完全个人编写,也没在任何公司项目上使用过, 不吹不黑,这玩意的编码规范,比很多公司的都正规,你想要的地方都写有注释, 它能解决95%业务上的问题,如果不能,那就是吹的,这玩意自带处理粘包机制, 不需要什么繁杂的操作,会调用函数就能使用,完全开源,下载下来,就是你的了。 老版本的通讯都是在头上添加2个或者4个位的字节,用来存储本次消息有多长, 以此来处理粘包问题,但是这种机制弊端很大,只要出错一次,那么就会完全炸开, 除非重新连接,而这玩意的处理粘包机制是使用头部+载荷的形式进行传输,头部使用 特殊的字符串包裹着,哪怕某次出问题了,也只会抛弃本次的消息,之后的通讯 也不会被干扰,此机制已经封装好了,不需要业务界面去手动干涉,如果你觉得你有 更好的方法,你可以自己更改。 最后的最后,这玩意应该是我的最终版本了,不再修改了。 #### 使用说明 注意,这玩意是.net6.0的,如果你想在.net4.6上运行的话,你需要自己重新新建 一个.net4.6的libraly库,然后去Nuget程序包上去搜索并安装下面这几个东西 (大佬都是不会去手动搜索的,都是直接以txt的形式打开,然后复制粘贴这5个引用 就完事了,懂的都懂,不懂的自己去Nuget上搜索) DotNetty.Buffers DotNetty.Codecs DotNetty.Common DotNetty.Handlers DotNetty.Transport 然后把代码文件全部替换进去就可以了, 编译之后,这玩意会变成一个dll, 你丢到别的地方也能使用,前提你要会引用dll ps:很多公司现在使用的大都是tcp,但是老版本的tcp已经落魄了,netty这玩意 的设计方法,碾压老版本的tcp,老版本的tcp,每链接个客户端都要开个线程去监听 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 最重要的一条,这玩意是libraly库,下载到本地之后,别直接双击打开,不然的话 VS不会去帮你自动去下载上面那5个东西,导致代码全部爆红。 正确做法是,自己新建一个项目出来, 鼠标右键最上面的解决方案 -> 添加 -> 现有项目 这样添加的话,VS才会自动帮你从Nuget上面把上面那5个东西下载下来 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ #### 代码说明 **【服务端】** (因为是可以开多个端口,所以有些方法需要指定服务器端口): 1、先声明局部全局变量(不会鼠标移动过去,添加命名空间依赖的话,建议关了吧, 这玩意还没到你该学习的阶段): private DotNettyService dotNettyService = new DotNettyService(); 2、然后实现三个回调事件即可 //客户端链接通知 dotNettyService.ConnectedAction = (info) => { //info.ClientIp:链接的客户端ip //info.ClientPort:链接的客户端端口 //info.ServicePort:链接的客户端所使用的服务器端口 //info.Connected:客户端是断开还是链接 } //接收客户端发送的数据 dotNettyService.ReceiveAction = (info) => { //info.ClientIp:链接的客户端ip //info.ClientPort:链接的客户端端口 //info.ServicePort:链接的客户端所使用的服务器端口 //info.Data:客户端发送过来的数据 } //文件接收进度反馈(如果你不用的话,可以省略) dotNettyService.FileProgressAction = (info) => { //这玩意就是个进度通知而已,内部自己做了接收并保存文件的操作 //保存在根目录下的 Receive 文件夹 //这玩意是分片的,可断点传输,具体操作都是内部帮做完了 //具体参数的话,自己按F12,有具体介绍 //向目标发送文件是下面这个函数 //dotNettyService.SendFile(clientIp, clientPort, fileFullName) } //错误通知(理论上基本没啥致命错误,可以省略) dotNettyService.ErrorAction = (ex) => { }; 3、开启服务,可重复调用 dotNettyService.StartService(listPort) 或者 dotNettyService.StartService(port) 4、关闭服务 //关闭全部端口 dotNettyService.CloseAllService() //关闭某一端口 dotNettyService.CloseService(servicePort) //关闭某一客户端 dotNettyService.CloseClient(clientIp, clientPort, servicePort) 5、发送数据 dotNettyService.SendToClient(clientIp,clientPort,servicePort,data) 6、完全释放(如果再次使用,需要重新new dotNettyService) dotNettyService.Dispone() ★★★★★★★★★★★★★★★★★★★★ 分割线 ★★★★★★★★★★★★★★★★★★★★★★★★★ **【客户端】** (因为是可以开多个端口,所以有些方法需要指定客户端端口): 1、先声明局部全局变量(不会鼠标移动过去,添加命名空间依赖的话,建议关了吧, 这玩意还没到你该学习的阶段): private DotNettyClient dotNettyClient = new DotNettyClient(); 2、然后实现三个回调事件即可 //客户端链接通知 dotNettyClient.ConnectedAction = (info) => { //info.ServiceIp:链接的服务器ip //info.ServicePort:链接的服务器端口 //info.ClientPort:链接的服务器所对应的本地客户端端口 //info.Connected:客户端是断开还是链接 } //接收服务器发送的数据 dotNettyClient.ReceiveAction = (info) => { //info.ServiceIp:链接的服务器ip //info.ServicePort:链接的服务器端口 //info.ClientPort:链接的服务器所对应的本地客户端端口 //info.Data:服务器发送过来的数据 } //文件接收进度反馈(如果你不用的话,可以省略) dotNettyClient.FileProgressAction = (info) => { //这玩意就是个进度通知而已,内部自己做了接收并保存文件的操作 //保存在根目录下的 Receive 文件夹 //这玩意是分片的,可断点传输,具体操作都是内部帮做完了 //具体参数的话,自己按F12,有具体介绍 //向目标发送文件是下面这个函数(只链接一个端口的话,后面两个不用填) //dotNettyClient.SendFile(fileFullName,servicePort,serviceIp) } //错误通知(理论上基本没啥致命错误,可以省略) dotNettyClient.ErrorAction = (ex) => { }; 3、开启监听,可重复调用 dotNettyClient.StartConnect(ServiceIp, ServicePort) 或者 dotNettyClient.StartConnect(listIp) 4、关闭链接 //关闭全部链接 dotNettyClient.CloseAllClient() //关闭某一链接(当只链接一个端口时,serviceIp可以省略) dotNettyClient.CloseClient(servicePort,serviceIp) 5、发送数据(只链接一个端口的话,servicePort和serviceIp都可以不填) dotNettyClient.SendData(data,servicePort,serviceIp) 6、完全释放(如果再次使用,需要重新new dotNettyClient) dotNettyClient.Dispone()