用netty开发socket服务
public void nettyMain() {
new Thread(new Runnable() {
public void run() {
// 1 创建线两个程组
// 一个是用于处理服务器端接收客户端连接的
// 一个是进行网络通信的(网络读写的)
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
// 2 创建辅助工具类,用于服务器通道的一系列配置
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup);
b.channel(NioServerSocketChannel.class);// 指定NIO的模式
b.option(ChannelOption.SO_BACKLOG, 1024); // 设置tcp缓冲区
b.option(ChannelOption.SO_SNDBUF, 32 * 1024); // 设置发送缓冲大小
b.option(ChannelOption.SO_RCVBUF, 32 * 1024); // 这是接收缓冲大小
b.option(ChannelOption.SO_KEEPALIVE, true); // 保持连接
b.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new SelfDecoder());
ch.pipeline().addLast(new SelfEncoder());
ch.pipeline().addLast(socketProtoBufHandler);
}
});
// 3、绑定端口 同步等待成功
Integer port = 8888;
ChannelFuture f = b.bind(port).sync();
logger.info("netty启动成功。。。" + "占用tcp端口" + port);
// 4、等待服务端监听端口关闭
f.channel().closeFuture().sync();
} catch (Exception e) {
logger.info("netty启动失败。。。");
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
}).start();
}
//参考http://www.wlkankan.cn/cate40/76.html
public class SocketProtoBufHandler extends ChannelInboundHandlerAdapter {
@Autowired
private SocketMessageProcessor messageProcessor;
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
log.info("socket登录");
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
NettyConnectionUtil.exit(ctx);
log.info("socket退出");
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
log.info("socket读取并处理消息");
//需要放到单独的分发器中处理
messageProcessor.handler(ctx, msg);
ctx.flush();
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.flush();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
log.error("socket异常 {}", cause);
NettyConnectionUtil.exit(ctx);
}
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
NettyConnectionUtil.exit(ctx);
}
}