【Netty4 简单项目实践】一、长连接服务通用框架原型
来源:互联网 发布:网络小兼职 编辑:程序博客网 时间:2024/06/05 03:59
第一个版本实现面向字符串的TCP长连接服务
看点:Liunx优化、TCP连接设置
服务端通用框架
- 生成一个ServerBootstrap对象
- 在ServerBootstrap对象的group中添加“接收消息循环队列”和“发送消息循环队列”两个对象
- 在ServerBootstrap对象上设置连接的属性(比如TCP连接属性:收发包缓冲区大小、TCP connect超时时间)
- 添加处理器Handler容器对象
- 在Handler容器内加载handler实例
public staticvoid main(String[] argv) throws Exception{
EventLoopGroup bossLoop = new NioEventLoopGroup(); //接收消息循环队列
EventLoopGroup workerLoop = new NioEventLoopGroup(); //发送消息循环队列
try{
ServerBootstrapbootstrap = new ServerBootstrap();
bootstrap.group(bossLoop,workerLoop)//加载消息循环队列
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)
.option(ChannelOption.TCP_NODELAY,true); //TCP立即发包
bootstrap.channel(NioServerSocketChannel.class);
bootstrap.localAddress(new InetSocketAddress(port))
.childHandler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
// TODO Auto-generated method stub
ChannelPipeline pipeline =ch.pipeline();
pipeline.addLast(new StringDecoder()); //Netty4自带的String解码器
pipeline.addLast(new StringEncoder()); //Netty4自带的String编码器
pipeline.addLast(new MyHandler()); // 自己实现的处理器
}
});
bootstrap.childOption(ChannelOption.SO_KEEPALIVE,true);
ChannelFuturefuture = bootstrap.bind(port).sync();
if (future.isSuccess()){}
future.channel().closeFuture().sync();
}catch (Exception e) {
}finally {
workerLoop.shutdownGracefully();
bossLoop.shutdownGracefully();
}
}
file:MyHandler.java
public class ProtoBufHandlerextends SimpleChannelInboundHandler<Protocol> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, Stringmsg) throws Exception {
System.out.println(msg);
ctx.writeAndFlush(msg);
ctx.close();
}
}到此就实现了一个简单的TCP字符串处理程序
【重要】
针对Linux的性能优化
String osName = System.getProperty("os.name");
EventLoopGroup bossLoop = null;
EventLoopGroup workerLoop = null;
if (osName.equals("Linux")) {
bossLoop = new EpollEventLoopGroup();
workerLoop = new EpollEventLoopGroup();
} else {
bossLoop = new NioEventLoopGroup();
workerLoop = new NioEventLoopGroup();
}
对bootstrap的channel也要设置一下
if (osName.equals("Linux")) {//Linux平台用Epoll模式
bootstrap.channel(EpollServerSocketChannel.class);
} else {
bootstrap.channel(NioServerSocketChannel.class);
}
TCP连接属性设置
很多文章一股脑把tcp连接属性都加上了,其实很多是不必要的,例如keepAlive。常用的如下:
bootstrap.group(bossLoop,workerLoop)
//keepAlive默认是打开
//.option(ChannelOption.SO_KEEPALIVE, true)
// 默认采用AdaptiveRecvByteBufAllocator分配器,不需要配置
//.option(ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator.DEFAULT)
//PooledByteBufAllocator这种分配器是默认分配器,当buffer被写入下一个节点的时候,它会
//自动释放,并放入pool里面
//.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)
.option(ChannelOption.SO_SNDBUF, 1024*256)//发包缓冲区,单位多少?
.option(ChannelOption.SO_RCVBUF, 1024*256)//收包换成区,单位多少?
.option(ChannelOption.TCP_NODELAY,true); //TCP立即发包
- 【Netty4 简单项目实践】一、长连接服务通用框架原型
- 【Netty4 简单项目实践】六、断掉未鉴权的TCP长连接--ChannelHandelContext中的定时器用法
- 【Netty4 简单项目实践】八、转发服务的实现方案
- 【Netty4 简单项目实践】九、示例项目
- 【Netty4 简单项目实践】五、Netty4接收HTTP文件上传
- 【Netty4 简单项目实践】四、添加Log工具-SL4J
- 【Netty4 简单项目实践】二、解决TCP连包问题:分隔符解码器
- 【Netty4 简单项目实践】三、压缩消息体:使用google的protocol buff
- 【Netty4 简单项目实践】七、上线前准备--内存泄漏监控、系统监控
- 【Netty4 简单项目实践】十、Http协议下使用protocol buff
- 【Netty4 简单项目实践】十一、用Netty分发mpegts到websocket接口
- Mina 长连接实践
- Java NIO框架--Netty4的简单示例
- Java NIO框架--Netty4的简单示例
- Netty 长连接服务
- Netty 长连接服务
- Netty 长连接服务
- Netty 长连接服务
- Elasticsearch
- GreenSock2
- 【多线程】Java线程的创建
- 给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
- Oracle 11g笔记——自动存储管理(ASM)
- 【Netty4 简单项目实践】一、长连接服务通用框架原型
- MySQL中information_schema数据库相关权限的说明
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- 数据挖掘-文本特征提取方法研究
- wustoj 1593: Count Zeros【线段树】
- h5和css3兼容IE8浏览器
- 位运算使用场景
- 浏览器的渲染原理简介
- 设置self.automaticallyAdjustsScrollViewInsets = NO