Netty | 01 - 服务器启动流程以及常用api笔记
发布日期:2022-02-21 17:40:28 浏览次数:55 分类:技术文章

本文共 3288 字,大约阅读时间需要 10 分钟。

1 前言

要启动一个Netty服务端,必须要指定三类属性,分别是:

  1. 线程模型
  2. IO 模型
  3. 连接读写处理逻辑

有了这三者,之后在调用bind(8000),我们就可以在本地绑定一个 8000 端口启动起来, 话不多说看代码吧

2 代码

public class NettyServer {
public static void main(String[] args) {
// 这两个对象可以看做是传统IO编程模型的两大线程组 // bossGroup表示监听端口, accept 新连接的线程组 NioEventLoopGroup bossGroup = new NioEventLoopGroup(); // workerGroup表示处理每一条连接的数据读写的线程组 NioEventLoopGroup workerGroup = new NioEventLoopGroup(); // 创建引导类 ServerBootstrap,这个类将引导我们进行服务端的启动工作 ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap // 给引导类配置两大线程组,这个引导类的线程模型也就定型了 .group(bossGroup, workerGroup) // 指定服务端的 IO 模型 .channel(NioServerSocketChannel.class) // 定义后续每条连接的数据读写,业务处理逻辑 .childHandler(new ChannelInitializer
() {
// 泛型参数NioSocketChannel,这个类就是 Netty 对 NIO 类型的连接的抽象,NioServerSocketChannel也是对 NIO 类型的连接的抽象,NioServerSocketChannel和NioSocketChannel的概念可以和 BIO 编程模型中的ServerSocket以及Socket两个概念对应上 protected void initChannel(NioSocketChannel ch) {
} }) /** ***************************************************************************** * 以上三个定义是最主要最核心的三个定义,下面扩展一些其他serverBootstrap中的方法 * ***************************************************************************** **/ // 和childHandler()方法对应起来,childHandler()用于指定处理新连接数据的读写处理逻辑 // handler()用于指定在服务端启动过程中的一些逻辑,通常情况下用不着这个方法 .handler(new ChannelInitializer
() {
protected void initChannel(NioServerSocketChannel ch) {
System.out.println("服务端启动中"); } }) // attr()方法可以给服务端的 channel,也就是NioServerSocketChannel指定一些自定义属性 // 然后可以通过channel.attr()取出这个属性 // 比如指定服务端channel的一个serverName属性,属性值为nettyServer // 其实说白了就是给NioServerSocketChannel维护一个map而已,通常情况下也用不上这个方法 .attr(AttributeKey.newInstance("serverName"), "nettyServer") // childAttr可以给每一条连接指定自定义属性,然后通过channel.attr()取出该属性 .childAttr(AttributeKey.newInstance("clientKey"), "clientValue") // 可以给每条连接设置一些TCP底层相关的属性 // 表示是否开启TCP底层心跳机制,true为开启 .childOption(ChannelOption.SO_KEEPALIVE, true) // 表示是否开启Nagle算法,true表示关闭,false表示开启 // 通俗地说,如果要求高实时性,有数据发送时就马上发送,就关闭 // 如果需要减少发送次数减少网络交互,就开启 .childOption(ChannelOption.TCP_NODELAY, true) // 表示系统用于临时存放已完成三次握手的请求的队列的最大长度 // 如果连接建立频繁,服务器处理创建新连接较慢,可以适当调大这个参数 .option(ChannelOption.SO_BACKLOG, 1024) ; // 监听端口是否绑定成功 bind(serverBootstrap, 1000); } private static void bind(final ServerBootstrap serverBootstrap, final int port) {
serverBootstrap.bind(port).addListener(future -> {
if (future.isSuccess()) {
System.out.println("端口[" + port + "]绑定成功!"); } else {
System.err.println("端口[" + port + "]绑定失败!"); bind(serverBootstrap, port + 1); } }); }}

转载地址:https://blog.csdn.net/weixin_40597409/article/details/122812684 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c++各种排序算法实现
下一篇:Netty | 03 - 客户端与服务端双向通信

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月10日 23时55分05秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章