前言
因项目需要将上百人的手机、平板与屏幕连接分享、互动。
需求:
1需要选择相对容易的通讯框架,方便技术团队能够快速上手,也便于职责分离;
2协议能够在百人聊天室内共享屏幕、分享数据、聊天、分组等等。。。我先写着未来再完善
提示:以下是本篇文章正文内容,下面案例可供参考
一、DotNetty是什么?
Netty 是JAVA的,DotNetty是微软官方开源的Netty项目。
DotNetty是Netty的端口,Netty是异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
开源项目地址:https://github.com/netty/netty
二、使用步骤
1.Nuget(New Get)获取
VisualStudio 2019 - 新建项目-NET5
右键解决方案-管理解决方案Nuget包
(这里说明一下,项目合作中推荐使用解决方案管理Nuget,如果项目右键管理,会出现版本冲突等系列问题。养成好习惯)
搜索“DotNetty” ,安装即可。NET 6版本已经出了预览版,建议大家先使用Net 5
PM> Install -package DotNetty
2.官方Demo
上文的开源项目下载地址,下载Netty。
生产环境使用Netty前,大家一定要看源码,这样有利于项目的理解。
https://github.com/netty/netty
3.协议
讲协议之前,需要先说明几个概念。
1,byte 也就是二进制文件,网络传输的就是这种数据作为基础。
2,Byte 二的8次方,也就是0-255所能表示的数,一般来讲,ASCII码能够用一个Byte标识。
3,编码ASCII、UTF8等等,不了解的自己上网去查。
通信的基础

如上图所示,客户端与服务端通信
- 首先,客户端把一个 Java 对象按照通信协议转换成二进制数据包。
- 然后通过网络,把这段二进制数据包发送到服务端,数据的传输过程由 TCP/IP 协议负责数据的传输,与我们的应用层无关。
- 服务端接受到数据之后,按照协议取出二进制数据包中的相应字段,包装成 Java 对象,交给应用逻辑处理。
- 服务端处理完之后,如果需要吐出响应给客户端,那么按照相同的流程进行。
协议的定义

上图每个方框代表的是一个Byte能够表示0-255
1.每次TCP连接,都携带该协议信息
2.客户端将数据对象封装(一般Json序列化)封包带上此协议头。
Netty客户端做的事情就是Encode(编码)
3.服务端收到二进制信息(含协议头)
Netty服务端做的事情是Decode(解码)
因此,编码和解码是使用Netty的关键,尤其在我们每个项目的数据不同,对协议的定义多少都有一些差异。
上图的协议理解为:
【1Byte的信令类型】【5Byte的用户名】【1Byte的分隔符】【3Byte的密码】
4.协议编码
Encode 继承自 MessageToMessageEncoder类。
该类提供泛型(包,概念后边讲)
为了便于理解编码过程,参加下图示例(该例子与上边的协议定义不一样,大家自己理解下这个协议的格式)

首先,协议定义为12Byte,前4位是魔数;版本号1位;算法标识1位;指令1位;数据长度4位;Json数据N位
4+1+1+1+4 = 11 ,如果收的的数据11位或小于11位,则解析无意义,直接返回。
其次,需要将编码后的数据,尤其是序列化的数据写入到outPut
5.协议解码
Decode 继承自 ByteToMessageDecoder类。

服务端将数据包,按照前4位是魔数;版本号1位;算法标识1位;指令1位;数据长度4位;Json数据N位
解析数据,然后将数据传递给Netty框架的Handler使用。
三、调试客户端与服务端
1. Echo.Server
先从Server开始,什么都不改,查看Program.cs
该类定义了启动一个服务端的完整示例,包括:
1.独立一个工作组,负责发现客户端的连接消息
2.独立工作组,负责处理具体Handler的内容。
3.定义证书,采用SSL加密,看项目需求
4.定义管道协议,TcpServerChannel,如果是UDP的话使用“SocketDatagramChannel”
5.添加Handler,默认LoggingHandler
6.添加子Handler, pipeline.AddLast 扩展我们自己的业务,比如LoginHandler,接收LoginPacket包。
7.扩展:样例没有,但未来自定义了协议,协议的Encode和Decode加到这里。

F5启动。
2. Echo.Client
同上步骤,完成客户端连接,如果成功的话,实现了连接。
3. 查看Handler
样例的Handler比较简单。
EchoServerHandler,负责接收数据,当客户端有数据发送时,简单打印信息,写一条string消息给客户端。
EchoClientHandler,负责发送与接收服务器返回数据,简单打印。
4. 自定义Handler
一,参照Handler的定义,我们可以写一个服务端自己的处理程序LoginResponseHandler。

需要关注的是,ChannelBaseHandler<LoginPacket> ,继承自泛型类,带有LoginPacket的自定义数据包


它的作用是,当客户端发送LoginPacket包

SERVER端的Handler直接拦截发现该类型的包对应的Handler,这会规避:
1.包的重复处理
2.业务信令的复杂IF\ELSE判断
3.业务的解耦
二,客户端我们写一个接收消息的Handler。


三,加入关键代码
1,客户端

2,服务端:

总结
致此,一个自定义协议、自定义业务Handler的项目搭建完毕。
本文主要是抛砖引玉,让复杂的Socket开发,尤其是面临黏包等问题。
如果大家需要实战,了解更深入的功能,请参见连接:
本文介绍如何使用DotNetty实现自定义协议与业务处理程序,包括项目搭建、调试客户端和服务端的方法,以及解决网络编程中常见问题的技巧。
&spm=1001.2101.3001.5002&articleId=115009775&d=1&t=3&u=9bb0f76cc5c14bb182bf609629019eb0)
9055

被折叠的 条评论
为什么被折叠?



