Netty的入门-基础编程
来源:互联网 发布:钢琴演奏家 软件 编辑:程序博客网 时间:2024/06/06 01:42
Server端实现:
public class TimeServer {public void bind(int port) throws Exception {// 配置服务端的NIO线程组EventLoopGroup bossGroup = new NioEventLoopGroup(); // 用于服务端接受客户端的连接EventLoopGroup workerGroup = new NioEventLoopGroup(); // 用于进行SocketChannel的网络读写try {// 服务端启动辅助类ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup) // 两个NIO线程组.channel(NioServerSocketChannel.class) // 设置要创建的Channel.option(ChannelOption.SO_BACKLOG, 1024) // 设置TCP参数.childOption(ChannelOption.SO_KEEPALIVE, true) // 保持心跳.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {socketChannel.pipeline().addLast(new TimeServerHandler());}}); // 绑定I/O事件的处理类,用于处理请求// 绑定端口,同步等待成功ChannelFuture f = b.bind(port).sync(); // 只要用于异步操作的通知回调// 等待服务端监听端口关闭f.channel().closeFuture().sync(); // 等待服务端链路关闭之后退出} catch (Exception e) {e.printStackTrace();} finally {// 优雅退出bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}private class TimeServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg)throws Exception {try {ByteBuf buf = (ByteBuf) msg;byte[] req = new byte[buf.readableBytes()];buf.readBytes(req);String body = new String(req, "UTF-8");System.out.println("The time server receive order : " + body);String currentTime = "QUERY TIME ORDER".equals(body) ? new Date(System.currentTimeMillis()).toString() : "Bad Order";ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes());ctx.write(resp); // 写到消息队列而不是写到SocketChannel中} finally {ReferenceCountUtil.release(msg);}}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx)throws Exception {// 将消息发送队列中的消息写入到SocketChannel中发送给对方// 从性能角度考虑,为了防止频繁的唤醒selector进行消息发送ctx.flush();}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)throws Exception {ctx.close();}}public static void main(String[] args) {try {new TimeServer().bind(1234);} catch (Exception e) {e.printStackTrace();}}
}
public class TimeClient {public void connect(int port, String host) {// 配置客户端NIO线程组EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch)throws Exception {ch.pipeline().addLast(new TimeClientHandler());}});// 发起异步连接操作ChannelFuture f = b.connect(host, port).sync();f.channel().closeFuture().sync();} catch (Exception e) {e.printStackTrace();} finally {// 优雅退出,释放NIO线程组group.shutdownGracefully();}}public class TimeClientHandler extends ChannelInboundHandlerAdapter {private final ByteBuf firstMessage;public TimeClientHandler() {super();byte[] req = "QUERY TIME ORDER".getBytes();firstMessage = Unpooled.buffer(req.length);firstMessage.writeBytes(req);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)throws Exception {ctx.close();}@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {ctx.writeAndFlush(firstMessage);}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg)throws Exception {ByteBuf buf = (ByteBuf) msg;byte[] req = new byte[buf.readableBytes()];buf.readBytes(req);String body = new String(req, "UTF-8");System.out.println("Now is " + body);}}public static void main(String[] args) {new TimeClient().connect(1234, "127.0.0.1");}}
0 0
- Netty的入门-基础编程
- Netty的入门-文件传输
- 【Netty入门】基于Netty的Server / Client
- 【Netty入门】Netty的线程模型
- 【Netty基础】Netty的“零拷贝”
- (socket-nio-netty学习-2)Netty基础入门
- netty基础入门(一)定义理解
- netty基础入门(channel理解)
- Netty的入门 - IO简介
- Netty的一大堆入门文章
- 用Netty开发中间件:网络编程基础
- netty的基础概念二
- 【Netty入门】Netty概述
- netty入门学习(2)-一个简单的netty实例
- Netty 入门
- Netty入门
- Netty入门
- netty入门
- Activity启动的四种模式:Standard,SingleTop,SingleTask,SingleInstance
- RocketMQ(五)性能测试报告
- spring 11 bean配置-基于注解配置bean
- PHP 时间戳 日期 转换等问题
- Spring quartz设置定时任务
- Netty的入门-基础编程
- java 8种原始数据类型
- Spring事务Transaction配置的五种注入方式详解
- z-index层重叠事件顺序以及解决办法
- cocos2dx
- mysql 创建视图时提示View's SELECT contains a subquery in the FROM clause
- 更改系统的蓝牙wifi 热点消息通知sleep 添加 never选项
- a:hover 与 a:link 和 a:visited的位置关系
- Android canvas.rotate的应用