Netty---ChannelOption

  • ChannelOption.SO_BACKLOG (一般用于option–>boss)
  • BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程都处于工作是(用完了),用于临时存放已完成三次握手的请求的队列的最大长度。如果未设置或所设置的值小于1,Java将使用默认值50。
  • ChannelOption.SO_REUSEADDR (一般用于option–>boss)
  • SO_REUSEADDR 对应的是socket选项中SO_REUSEADDR,这个参数表示允许重复使用本地地址和端口,例如,某个服务占用了TCP的8080端口,其他服务再对这个端口进行监听就会报错,SO_REUSEADDR这个参数就是用来解决这个问题的,该参数允许服务公用一个端口,这个在服务器程序中比较常用,例如某个进程非正常退出,对一个端口的占用可能不会立即释放,这时候如果不设置这个参数,其他进程就不能立即使用这个端口。
  • ChannelOption.ALLOCATOR
  • Netty参数,ByteBuf的分配器(重用缓冲区),默认值为ByteBufAllocator.DEFAULT,4.0版本为UnpooledByteBufAllocator,4.1版本为PooledByteBufAllocator。该值也可以使用系统参数io.netty.allocator.type配置,使用字符串值:“unpooled”,“pooled”。
  • 额外解释, Netty4.1使用对象池,重用缓冲区(可以直接只用这个配置)
  • bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
  • bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
  • ChannelOption.RCVBUF_ALLOCATOR (一般用于option->boss)
  • Netty参数,用于Channel分配接受Buffer的分配器,默认值为AdaptiveRecvByteBufAllocator.DEFAULT,是一个自适应的接受缓冲区分配器,能根据接受到的数据自动调节大小。可选值为FixedRecvByteBufAllocator,固定大小的接受缓冲区分配器。
  • ChannelOption.TCP_NODELAY (一般用于childOption)
  • TCP_NODELAY 对应于socket选项中的TCP_NODELAY,该参数的使用和Nagle算法有关,Nagle算法是将小的数据包组装为更大的帧进行发送,而不会来一个数据包发送一次,目的是为了提高每次发送的效率,因此在数据包没有组成足够大的帧时,就会延迟该数据包的发送,虽然提高了网络负载却造成了延时,TCP_NODELAY参数设置为true,就可以禁用Nagle算法,即使用小数据包即时传输。
  • 或者
  • TCP_NODELAY就是用于启用或关闭Nagle算法。如果要求高实时性,有数据发送时就马上发送,就将该选项设置为true关闭Nagle算法;如果要减少发送次数减少网络交互,就设置为false等累积一定大小后再发送。默认为false。
  • ChannelOption.SO_SNDBUF 和ChannelOption.SO_RCVBUF (一般用于childOption)
  • SO_SNDBUF 和 SO_RCVBUF对应socket中的SO_SNDBUF和SO_RCVBUF参数,即设置发送缓冲区和接收缓冲区的大小,发送缓冲区用于保存发送数据,直到发送成功,接收缓冲区用于保存网络协议站内收到的数据,直到程序读取成功。
  • 或者
  • SO_RCVBUF参数,TCP数据接收缓冲区大小。该缓冲区即TCP接收滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_rmem查询其大小。一般情况下,该值可由用户在任意时刻设置,但当设置值超过64KB时,需要在连接到远端之前设置。
  • SO_SNDBUF参数,TCP数据发送缓冲区大小。该缓冲区即TCP发送滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_smem查询其大小。
  • ChannelOption.CONNECT_TIMEOUT_MILLIS: (一般用于Bootstrap或者childOption)
  • Netty参数,连接超时毫秒数,默认值30000毫秒即30秒。
  • ChannelOption.SO_LINGER (一般用于childOption)
  • Socket参数,关闭Socket的延迟时间,默认值为-1,表示禁用该功能。-1表示socket.close()方法立即返回,但OS底层会将发送缓冲区全部发送到对端。0表示socket.close()方法立即返回,OS放弃发送缓冲区的数据直接向对端发送RST包,对端收到复位错误。非0整数值表示调用socket.close()方法的线程被阻塞直到延迟时间到或发送缓冲区中的数据发送完毕,若超时,则对端会收到复位错误。
  • ChannelOption.SO_KEEPALIVE
  •   Socket参数,连接保活,默认值为False。启用该功能时,TCP会主动探测空闲连接的有效性。可以将此功能视为TCP的心跳机制,需要注意的是:默认的心跳间隔是7200s即2小时。Netty默认关闭该功能。
  • ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK (一般用于childOption)
  •   Netty参数,写高水位标记,默认值64KB。如果Netty的写缓冲区中的字节超过该值,Channel的isWritable()返回False。
  • ChannelOption.WRITE_BUFFER_LOW_WATER_MARK (一般用于childOption)
  •   Netty参数,写低水位标记,默认值32KB。当Netty的写缓冲区中的字节超过高水位之后若下降到低水位,则Channel的isWritable()返回True。写高低水位标记使用户可以控制写入数据速度,从而实现流量控制。推荐做法是:每次调用channl.write(msg)方法首先调用channel.isWritable()判断是否可写。
  • ChannelOption.AUTO_READ (一般用于childOption)
  •   Netty参数,自动读取,默认值为True。Netty只在必要的时候才设置关心相应的I/O事件。对于读操作,需要调用channel.read()设置关心的I/O事件为OP_READ,这样若有数据到达才能读取以供用户处理。该值为True时,每次读操作完毕后会自动调用channel.read(),从而有数据到达便能读取;否则,需要用户手动调用channel.read()。需要注意的是:当调用config.setAutoRead(boolean)方法时,如果状态由false变为true,将会调用channel.read()方法读取数据;由true变为false,将调用config.autoReadCleared()方法终止数据读取。
  • ChannelOption.MAX_MESSAGES_PER_READ
  •   Netty参数,一次Loop读取的最大消息数,对于ServerChannel或者NioByteChannel,默认值为16,其他Channel默认值为1。默认值这样设置,是因为:ServerChannel需要接受足够多的连接,保证大吞吐量,NioByteChannel可以减少不必要的系统调用select。
  • ChannelOption.WRITE_SPIN_COUNT
  •   Netty参数,一个Loop写操作执行的最大次数,默认值为16。也就是说,对于大数据量的写操作至多进行16次,如果16次仍没有全部写完数据,此时会提交一个新的写任务给EventLoop,任务将在下次调度继续执行。这样,其他的写请求才能被响应不会因为单个大数据量写请求而耽误。
  • ChannelOption.MESSAGE_SIZE_ESTIMATOR
  •   Netty参数,消息大小估算器,默认为DefaultMessageSizeEstimator.DEFAULT。估算ByteBuf、ByteBufHolder和FileRegion的大小,其中ByteBuf和ByteBufHolder为实际大小,FileRegion估算值为0。该值估算的字节数在计算水位时使用,FileRegion为0可知FileRegion不影响高低水位
  • ChannelOption.SINGLE_EVENTEXECUTOR_PER_GROUP
  •   Netty参数,单线程执行ChannelPipeline中的事件,默认值为True。该值控制执行ChannelPipeline中执行ChannelHandler的线程。如果为True,整个pipeline由一个线程执行,这样不需要进行线程切换以及线程同步,是Netty4的推荐做法;如果为False,ChannelHandler中的处理过程会由Group中的不同线程执行。


原文链接:https://blog.csdn.net/zhongzunfa/article/details/94590670

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Netty中使用WebSocket SSL,需要进行以下步骤: 1. 创建SSLContext对象 ``` KeyStore keyStore = KeyStore.getInstance("JKS"); InputStream stream = new FileInputStream("keystore.jks"); keyStore.load(stream, "password".toCharArray()); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, "password".toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(keyStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); ``` 其中,keystore.jks是包含SSL证书的密钥库文件,password是密钥库密码。 2. 配置SslContext ``` SslContext sslCtx = SslContextBuilder.forServer(keyManagerFactory) .trustManager(trustManagerFactory) .build(); ``` 3. 配置WebSocketServerHandler ``` public class WebSocketServerHandler extends SimpleChannelInboundHandler<WebSocketFrame> { private final WebSocketServerHandshaker handshaker; public WebSocketServerHandler(WebSocketServerHandshaker handshaker) { this.handshaker = handshaker; } @Override protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception { // 处理WebSocket消息 } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { // 握手成功后,建立WebSocket连接 handshaker.handshake(ctx.channel(), new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK)); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { // 处理异常 } } ``` 4. 配置WebSocketServerInitializer ``` public class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> { private final SslContext sslCtx; public WebSocketServerInitializer(SslContext sslCtx) { this.sslCtx = sslCtx; } @Override public void initChannel(SocketChannel ch) throws Exception { // 配置ChannelPipeline ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new HttpServerCodec()); pipeline.addLast(new HttpObjectAggregator(65536)); pipeline.addLast(new WebSocketServerProtocolHandler("/websocket")); pipeline.addLast(new WebSocketServerHandler(handshaker)); pipeline.addLast(sslCtx.newHandler(ch.alloc())); } } ``` 其中,WebSocketServerProtocolHandler是Netty提供的WebSocket协议处理器,用于处理WebSocket握手和帧。 5. 启动WebSocket服务器 ``` EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new WebSocketServerInitializer(sslCtx)) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = b.bind(port).sync(); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } ``` 其中,sslCtx是之前创建的SSLContext对象。 以上就是在Netty中配置WebSocket SSL的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值