Netty学习(八)-- 练习

练习

实现一个 echo Server

编写服务端:

/**
 * @desc
 * @auth llp
 * @date 2022/8/8 15:19
 */
public class EchoServer {
    
    
    public static void main(String[] args) {
    
    
        new ServerBootstrap()
                .group(new NioEventLoopGroup())
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChannelInitializer<SocketChannel>() {
    
    
                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
    
    
                        // 入站处理器
                        ch.pipeline().addLast("readHandler", new ChannelInboundHandlerAdapter(){
    
    
                            @Override
                            public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    
    
                                // 思考:是否需要 buf 释放?
                                ByteBuf buf = msg instanceof ByteBuf ? (ByteBuf) msg : null;
                                if (buf != null){
    
    
                                    System.out.println(buf.toString(Charset.defaultCharset()));
                                    buf.release();
                                }else {
    
    
                                    System.out.println("null");
                                }
                                // 建议使用 ctx.alloc() 创建 ByteBuf
                                ByteBuf response = ctx.alloc().buffer();
                                response.writeBytes("hello I am Server.".getBytes());
                                ctx.writeAndFlush(response);
                                // 思考:response 是否需要释放
                                response.release();
                            }
                        });
                    }
                })
                .bind(8888);
    }
}

编写客户端:

/**
 * @desc
 * @auth llp
 * @date 2022/8/8 15:25
 */
public class EchoClient {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        ChannelFuture channelFuture = new Bootstrap()
                .group(new NioEventLoopGroup())
                .channel(NioSocketChannel.class)
                .handler(new ChannelInitializer<SocketChannel>() {
    
    
                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
    
    
                        ch.pipeline().addLast(new ChannelInboundHandlerAdapter(){
    
    
                            @Override   // 建立连接后触发
                            public void channelActive(ChannelHandlerContext ctx) throws Exception {
    
    
                                ByteBuf buf = ctx.alloc().buffer(10);
                                // 首次连接发送 hello
                                buf.writeBytes("hello I am Client.".getBytes());
                                ctx.writeAndFlush(buf);
                                // 思考:是否需要释放 buf
                                buf.release();
                            }
                            @Override
                            public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    
    
                                // 思考:是否需要 buf 释放?
                                ByteBuf buf = msg instanceof ByteBuf ? (ByteBuf) msg : null;
                                if (buf != null){
    
    
                                    System.out.println(buf.toString(Charset.defaultCharset()));
                                    buf.release();
                                }else {
    
    
                                    System.out.println("null");
                                }
                            }
                        });
                    }
                })
                .connect("localhost", 8888);
    }
}

Java Socket 是全双工的,线路上存在 A 到 BB 到 A 的双向信号传输,即时是阻塞 IO,读和写是可以同时进行的,只要分别采用读线程和写线程即可,读不会阻塞写、写也不会阻塞读。

猜你喜欢

转载自blog.csdn.net/weixin_43989102/article/details/126736457
今日推荐