首页 > 其他分享 >用Netty实现一个简单全双工通信

用Netty实现一个简单全双工通信

时间:2023-11-20 22:33:28浏览次数:28  
标签:Netty void 通信 var msg new 全双工 buf public

用Netty实现一个简单全双工通信


​ 如题,需要注意在ByteBuf使用的过程中要使用buf.retain()保证buf引用计数大于0,才能够正常使用否则会报异常,原因是pipeline上的handler都是使用NIO线程执行的,因此使用buf的handler和tail handler(最后调用buf release的handler)是不同的线程,因此是异步的就会出现上面的问题

​ EchoServer.class

/**
 * @description: some desc
 * @author: admin
 * @email: [email protected]
 * @date: 2023/11/20 21:16
 */
@Slf4j
public class EchoServer {
    public static void main(String[] args) {
        new ServerBootstrap()
                .group(new NioEventLoopGroup())
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    @Override
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        ch.pipeline()
                                .addLast(new ChannelInboundHandlerAdapter() {
                                    @Override
                                    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                        if (msg instanceof ByteBuf) {
                                            var buf = (ByteBuf) msg;
                                            var str = buf.toString(Charset.defaultCharset());
                                            log.debug(str);
                                            buf.retain();
                                            ctx.writeAndFlush(ByteBufAllocator.DEFAULT.buffer().writeBytes(("Hello, I'm Server:" + str).getBytes()));
                                        }
                                        super.channelRead(ctx, msg);
                                    }
                                });
                    }
                }).bind(8080);
    }
}

​ EchoClient.class

/**
 * @description: some desc
 * @author: admin
 * @email: [email protected]
 * @date: 2023/11/20 21:16
 */
@Slf4j
public class EchoClient {
    public static void main(String[] args) throws InterruptedException {
        var channelFuture = new Bootstrap()
                .group(new NioEventLoopGroup())
                .channel(NioSocketChannel.class)
                .handler(new ChannelInitializer<NioSocketChannel>() {

                    @Override
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new StringEncoder())
                                .addLast(new ChannelInboundHandlerAdapter() {
                                    @Override
                                    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                        if (msg instanceof ByteBuf) {
                                            var buf = (ByteBuf) msg;
                                            buf.retain();
                                            log.debug(buf.toString(Charset.defaultCharset()));
                                        }
                                        super.channelRead(ctx, msg);
                                    }
                                });
                    }
                }).connect(new InetSocketAddress(8080));

        var channel = channelFuture.sync()
                .channel();
        while (true) {
            Scanner sc = new Scanner(System.in);
            var input = sc.next();
            if ("q".equals(input)) {
                break;
            }
            channel.writeAndFlush(input);
        }

    }
}

标签:Netty,void,通信,var,msg,new,全双工,buf,public
From: https://www.cnblogs.com/tod4/p/17845071.html

相关文章

  • Netty-操作篇
    服务端创建步骤步骤一:创建ServerBootstrap实例。步骤二:设置并绑定Reactor线程池。步骤三:设置并绑定服务端Channel。步骤四:链路建立的时候创建并初始化ChannelPipeline(非必须)。用于处理网络事件:1.链路注册、激活、断开、发生异常2.接收到请求消息3.请求消息接收并处理完毕......
  • Netty-基础篇(4)
    不使用Java原生NIO编程的原因1、NIO的类库和API复杂,使用麻烦2、需要具备其他的额外技能做铺垫,例如熟悉Java多线程编程3、可靠性能力补齐,工作量和难度都非常大。例如客户端面临断线重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题。4、JDKNIO的BUG,例如臭......
  • Linux - 内存间通信
    进程间通信 Linux下进程通信的方式有管道:管道用于有亲缘关系的进程间通信有名管道:除了管道特性外还能在独立进程间进行通信信号:用于通知进程有某种事件发生消息队列:用于进程间较多数据的通信,有读写权限的进程可以向队列中添加消息。只有读权限则只能读取队列中消......
  • Socket支持下的点对点通信的实现(服务端与客户端注释)
    服务端程序importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjava.net.*;importjavax.swing.*;publicclassServerextendsJFrameimplementsActionListener{ ServerSocketss=null;//ServerSocket对象 Sockets=null;//Socket对象 pr......
  • Netty源码学习4——服务端是处理新连接的&netty的reactor模式
    系列文章目录和关于我零丶引入在前面的源码学习中,梳理了服务端的启动,以及NioEventLoop事件循环的工作流程,并了解了Netty处理网络io重要的Channel,ChannelHandler,ChannelPipeline。这一篇将学习服务端是如何构建新的连接。一丶网络包接收流程当客户端发送的网络数据帧通过网......
  • 进程间通信的方式之消息队列和共享内存
    消息队列消息队列就是保存在内核中的消息链表,包括Posix消息队列和SystemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。共享内存共享内存的机制,......
  • 物联网窄带宽无线通信协议对比
    物联网窄带宽无线通信协议对比直接上表格:协议类型优点优点是否需要网关应用场景Zigbee:基于IEEE802.15.41、功耗很低2、实时性好、稳定性好3、支持星型网络,一对多通信,也支持mesh4、网络容量大5、2.4G高频传输,且传输数据量相对较大6、室内通信距离20~30米7、安全等......
  • 同网段及跨网段主机间通信原理
    在以太网络通信中,在 IP 数据包中有两个必不可少的地址,那就是 IP 地址和网卡地址(即 MAC 地址),在数据包中,无论是 IP 地址还是 MAC 地址,都有源地址和目标地址,因为通信是双方的,所以就必须同时拥有双方的地址!在同一 IP 网络中通信,将会发生以下事件:1、同网段主机间通信主机......
  • 12_串口通信
    串口通信串口介绍接口及引脚定义硬件电路电平标准常见通信接口比较相关术语51单片机的UART串口参数及时序图串口模式图串口和中断系统串口相关寄存器单片机每隔一秒向电脑发送数据UART.c#include<REGX52.H>/***@brief串口初始化*@param无......
  • Netty-基础篇(2)
    ByteBuf——Netty的数据容器概念:Netty提供的字节容器,可以对字节进行高效操作,包括读写、查找等。数据处理组件1.abstractclassByteBuf2.interfaceByteBufHolderByteBufAPI的优点:1.它可以被用户自定义的缓冲类型扩展2.通过内置的复合缓冲区类型实现了透明的零拷贝3.容量......