netty实战之ChannelOption配置

原创 2017年08月29日 19:23:05

服务端ServerBootstrap之ChannelOption配置


public static void main(String[] args) throws InterruptedException {
        EventLoopGroup parentGroup = new NioEventLoopGroup();
        EventLoopGroup childGroup = new NioEventLoopGroup();

        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(parentGroup, childGroup);

        serverBootstrap.option(ChannelOption.SO_REUSEADDR,true);

        serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true)
        serverBootstrap.childOption(ChannelOption.TCP_NODELAY, true);

    }

SO_REUSEADDR=true

设置SO_REUSEADDR为true,意味着地址可以复用,比如如下场景

某个进程占用了80端口,然后重启进程,原来的socket1处于TIME-WAIT状态,进程启动后,使用一个新的socket2,要占用80端口,如果这个时候不设置SO_REUSEADDR=true,那么启动的过程中会报端口已被占用的异常。

注意,这个SO_REUSEADDR是使用serverBootstrap的option方法来设置,而不是使用childOption方法来设置,要知道具体原因,可以先看李林峰关于netty线程模式

Netty系列之Netty线程模型

简单来说就是option操作是针对parentGroup的,而childOption是针对childGroup的。


SO_KEEPALIVE=true

SO_KEEPALIVE=true,是利用TCP的SO_KEEPALIVE属性,当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端因为断电或者网络问题或者客户端挂掉了等,那么服务端的连接可以关闭掉,释放资源。


TCP_NODELAY=true


如果TCP_NODELAY没有设置为true,那么底层的TCP为了能减少交互次数,会将网络数据积累到一定的数量后,服务器端才发送出去,会造成一定的延迟。在互联网应用中,通常希望服务是低延迟的,建议将TCP_NODELAY设置为true。


客户端Bootstrap之ChannelOption配置


public static void main(String[] args) throws InterruptedException {
        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        Bootstrap bootstrap = new Bootstrap();
        bootstrap.group(eventLoopGroup);

        bootstrap.option(ChannelOption.SO_KEEPALIVE, Boolean.TRUE)
                 .option(ChannelOption.TCP_NODELAY, Boolean.TRUE)
                 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000);
    }

客户端的netty代码,一般就使用一个EventLoopGroup就可以了,所以这里用option方法来设置属性。
SO_KEEPALIVE和TCP_NODELAY的含义跟上面服务端代码是一样的。

通常客户端代码中还会设置一个CONNECT_TIMEOUT_MILLIS,表示客户端调用服务端接口的超时时间。这个设置可以当做一个默认设置,我们在应用层,服务端接口一定要能支持设置超时时间,因为不同的业务服务接口,针对不同场景,超时时间可能是不同的。

上面这些netty中关于ChannelOption属性设置,已经在线上用了三年了,并且经过了大流量的验证,暂时还没发现问题。

版权声明:本文为博主原创文章,未经博主允许不得转载。

【Netty4 简单项目实践】一、长连接服务通用框架原型

第一个版本实现面向字符串的TCP长连接服务 看点:Liunx优化、TCP连接设置 服务端通用框架 在Netty4中,所有的服务端使用相同的框架结构。 生成一个ServerBoo...
  • arctan90
  • arctan90
  • 2016年04月25日 18:20
  • 2984

Netty通信框架Java实现小记

1、Netty介绍    Netty通俗地说就是一套Socket通信框架,提供异步的、事件驱动的网络应用程序框架和工具,可快速开发高性能、高可靠性的网络服务器和客户端程序 2、Netty的特性...
  • fjssharpsword
  • fjssharpsword
  • 2016年08月29日 16:14
  • 3135

nio实战之netty实现

什么是nioio多路复用技术,把多个io的阻塞复用到同一个selector的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。适用场景:高负载、高并发原阻塞io的问题 每个请求的处理都需...
  • guzhangyu12345
  • guzhangyu12345
  • 2017年06月07日 13:25
  • 1490

Netty之ChannelOption

1、ChannelOption.SO_BACKLOG  ChannelOption.SO_BACKLOG对应的是tcp/ip协议listen函数中的backlog参数,函数listen(int soc...
  • ayw255
  • ayw255
  • 2017年03月16日 18:56
  • 1437

Netty 常量池实现以及ChannelOption与Attribute作用分析

ChannelOption 主要是配置一些底层网络层比如说TCP协议 里面的一些设置项,而且是以线程安全的方式配置channelConfig。ChannelOption并不维护对应的vlaue,而是...
  • lm324114
  • lm324114
  • 2017年11月19日 12:19
  • 70

netty实战.pdf

  • 2018年01月13日 09:20
  • 12.87MB
  • 下载

Netty实战完中文整版

  • 2017年12月27日 14:08
  • 12.88MB
  • 下载

Netty 实战中文清晰版

  • 2017年12月28日 19:47
  • 12.92MB
  • 下载

Netty实战 epub

  • 2017年12月20日 20:15
  • 3.87MB
  • 下载

netty实战-中文版。2分下载

  • 2017年12月29日 08:20
  • 12.87MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty实战之ChannelOption配置
举报原因:
原因补充:

(最多只允许输入30个字)