前一阵子学习了基于.net core的Socket编程。觉得很是有趣。准备深入学习一下Socket编程,听闻Java的Netty框架很是优秀。所以今天来了解一下—DotNetty
这个东西是怎么来的呢? 是.net core版的Netty。具体怎么来的请自行百度。在此不赘述!!!
Netty是一个提供 asynchronous event-driven (异步事件驱动)的网络应用框架,是一个用以快速开发高性能、可扩展协议的服务器和客户端。
换句话说,Netty 是一个 NIO (同步非阻塞)客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发。
socket通信分为三种:
BIO: 传统阻塞IO
NIO: 同步非阻塞式IO
AIO: 异步非阻塞IO,(非阻塞采用的是注册通知的模式。)
官方也提供了一些例子。地址如下
https://github.com/Azure/DotNetty
也可自行看例子学习
下面开始学习。和简单摸索!(参考Netty官方文档会比看我我写的学习更快)
https://waylau.com/netty-4-user-guide/ 中文文档(非官方翻译)
http://netty.io/wiki/all-documents.html 英文文档
因为本人比较小白。所以此篇文章会从最开始创建项目开始为大家一一讲述
Netty的核心理念:
NuGet一搜索DotNetty会发现一堆相关引用。这里需要讲一下各个库都是分别做什么的
DotNetty.Buffers: 对内存缓冲区管理的封装。
DotNetty.Codecs: 对编解码是封装,包括一些基础基类的实现,我们在项目中自定义的协议,都要继承该项目的特定基类和实现。
DotNetty.Codecs.Mqtt: MQTT(消息队列遥测传输)编解码是封装,包括一些基础基类的实现。
DotNetty.Codecs.Protobuf: Protobuf 编解码是封装,包括一些基础基类的实现。
DotNetty.Codecs.ProtocolBuffers: ProtocolBuffers编解码是封装,包括一些基础基类的实现。
DotNetty.Codecs.Redis: Redis 协议编解码是封装,包括一些基础基类的实现。
DotNetty.Common: 公共的类库项目,包装线程池,并行任务和常用帮助类的封装。
DotNetty.Handlers: 封装了常用的管道处理器,比如Tls编解码,超时机制,心跳检查,日志等。
DotNetty.Transport: DotNetty核心的实现,Socket基础框架,通信模式:异步非阻塞。
DotNetty.Transport.Libuv: DotNetty自己实现基于Libuv (高性能的,事件驱动的I/O库) 核心的实现。
channelActive() 方法将会在连接被建立并且准备进行通信时被调用。因此让我们在这个方法里完成一个代表当前时间的32位整数消息的构建工作。
回调方法 | 触发时机 | client | server |
channelRegistered | 当前channel注册到EventLoop | true | true |
channelUnregistered | 当前channel从EventLoop取消注册 | true | true |
channelActive | 当前channel激活的时候 | true | true |
channelInactive | 当前channel不活跃的时候,也就是当前channel到了它生命周期末 | true | true |
channelRead | 当前channel从远端读取到数据 | true | true |
channelReadComplete | channel read消费完读取的数据的时候被触发 | true | true |
userEventTriggered | 用户事件触发的时候 | ||
channelWritabilityChanged | channel的写状态变化的时候触发 |
有了如上这些准备工作。下面咱们就可以开始写一些服务了。由于书写量过多。所以所有单独服务都会令开辟文章
服务端:
https://blog.csdn.net/a1234012340a/article/details/91041956
客户端:
https://blog.csdn.net/a1234012340a/article/details/93138687
服务端:
https://blog.csdn.net/a1234012340a/article/details/92649538
客户端:
因为Echo和Discard本身没有太大的区别。只不过一个是丢弃,另一个是读取数据显示,并且返回数据。客户端获取返回数据,显示(和服务端流程一样)。所以Echo的客户端代码以及讲解就不在赘述!
服务端:
https://blog.csdn.net/a1234012340a/article/details/92650374
https://blog.csdn.net/a1234012340a/article/details/100040073
——————————————————————————————————
作者:Henny_CHN
转载请标明出处,原文地址:
https://blog.csdn.net/a1234012340a/article/details/91040073
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作最大的动力,谢谢!