首页 > 其他分享 >往 netty Channel中写入字符串

往 netty Channel中写入字符串

时间:2024-03-05 14:33:24浏览次数:40  
标签:netty 写入 charset ctx ClientHandler 字符串 new StringEncoder Channel

示例代码:

EventLoopGroup group = new NioEventLoopGroup();
 Bootstrap bootstrap = new Bootstrap();
            bootstrap.group(group)
                    .channel(NioSocketChannel.class)
                    .option(ChannelOption.SO_KEEPALIVE, true)
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            // 添加你需要的ChannelHandler
                            ch.pipeline().addLast(new ClientHandler());
                        }
                    });

上面是一个 netty client,在ClientHandler中写入数据:

class ClientHandler extends ChannelInboundHandlerAdapter {
   @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
//        ChannelFuture channelFuture = ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rocks!",
//                CharsetUtil.UTF_8));
        ChannelFuture channelFuture = ctx.writeAndFlush("nihao");
        channelFuture.addListener(f -> {
            if (f.isSuccess()) {
                System.out.println("write success");
            } else {
                System.err.println("failed to write");
                f.cause().printStackTrace();
            }
        });
    }
}

write了一个字符串“nihao”,这时候报错了:
java.lang.UnsupportedOperationException: unsupported message type: String (expected: ByteBuf, FileRegion)

https://stackoverflow.com/questions/49396919/why-is-channelhandlercontext-writeandflush-not-processing-my-string

不支持写入字符串类型。

参考上述链接,需要再增加一个StringEncoder handler就可以了。

      ch.pipeline().addLast(new StringEncoder()).addLast(new ClientHandler());

image
参考这里关于handler执行顺序的解析,当执行出站操作时(这里的write,对应的就是出站事件),会先执行尾部的Handler,即ClientHandler,此时写入的是字符串,然后执行StringEncoder handler,会把字符串转换成byte数组。

public class StringEncoder extends MessageToMessageEncoder<CharSequence> {
    private final Charset charset;

    public StringEncoder() {
        this(Charset.defaultCharset());
    }

    public StringEncoder(Charset charset) {
        this.charset = (Charset)ObjectUtil.checkNotNull(charset, "charset");
    }

    protected void encode(ChannelHandlerContext ctx, CharSequence msg, List<Object> out) throws Exception {
        if (msg.length() != 0) {
            out.add(ByteBufUtil.encodeString(ctx.alloc(), CharBuffer.wrap(msg), this.charset));
        }
    }
}

标签:netty,写入,charset,ctx,ClientHandler,字符串,new,StringEncoder,Channel
From: https://www.cnblogs.com/xushengbin/p/18053987

相关文章

  • netty client请求127.0.0.1:8081,server端无响应问题排查
    问题描述代码:https://github.com/normanmaurer/netty-in-action/tree/2.0-SNAPSHOT/chapter2利用netty,起了两个服务:echoServer,绑定8081端口。echoClient,请求127.0.0.1:8081端口。client和server建立链接之后,并发送报文:publicclassEchoClientHandlerextendsSi......
  • NLog条件配置——实现将包含某个特定字符串日志写入指定文件
    需求产生缘由在开发中为了了解程序在运行的内存状态并记录下来,以便出问题时判断是不是与内存相关。于是实时采集了开发程序需要的内存信息。但采集的内存信息在存储时,以NLog中的Trace级别来存储的话,会与程序其它Trace级别的日志都记录在相同的TraceLog文件下,这会导致在查看内存......
  • pd.ExcelWriter 实现数据写入不同sheet
    pd.ExcelWriter将数据写入不同sheet当结合for循环使用时,需注意放在for循环前面以下写法,仅生成一个sheet,原因在于pd.ExcelWriter的mode默认是w,每次for循环写入数据都会对原有的数据进行覆盖,最终只会生成一个sheet。importpandasaspddf1=pd.DataFrame([["AAA","BBB"]],......
  • iexcel-excel 读取和写入,解决 excel OOM 问题
    项目简介IExcel用于优雅地读取和写入excel。避免大excel出现oom,简约而不简单。特性一行代码搞定一切OO的方式操作excel,编程更加方便优雅。sax模式读取,SXSS模式写入。避免excel大文件OOM。基于注解,编程更加灵活。设计简单,注释完整。方便大家学习改造......
  • Slave被误写入数据如何恢复到主库
    背景在GreatSQL主从复制环境中,有时候可能会出现一些误操作,将本应该写入到主库的数据写入到了从库,导致主从数据不一致,影响数据同步。是否可以将写入从库的数据同步写入主库呢?测试环境角色IP地址数据库开放端口版本主库192.168.137.1793308GreatSQL8.0.32从库......
  • MCN公司,即Multi-Channel Network
    MCN公司MCN公司,即Multi-ChannelNetwork,是一种新型的数字内容营销和传播机构。它们通常专注于网络红人(KOL)的孵化、内容创作、分发和商业化。MCN公司通过签约和培养网络红人,利用这些红人的影响力在社交媒体、视频平台等渠道上推广品牌和产品。在中国,知名的MCN公......
  • C#使用Channel实现异步任务之间的通信
    channel中也是有一个ConcurrentQueue来维护的usingSystem.Threading.Channels;varchannel=Channel.CreateUnbounded<Message>();//在赋值的时候,两个Task就开始执行了,下面的await就是为了等待执行完成varsender1=SendMessageAsync(channel.Writer,1);varsender2=......
  • Go语言精进之路读书笔记第34条——了解channel的妙用
    c:=make(chanint)//创建一个无缓冲(unbuffered)的int类型的channelc:=make(chanint,5)//创建一个带缓冲的int类型的channelc<-x//向channelc中发送一个值<-c//从channelc中接收一个值x=<-c//从channelc接收一个值并......
  • kettle从入门到精通 第四十七课 ETL之kettle mongo output 写入
    1、上一节课我们学习了mongoinput读取步骤,本节课我们一起学习下mongoout写入步骤,该步骤可以将数据写入到mongo中,如下图所示。 2、 配置mongo连接,有两种方式,如截图所示。ConnectionString:如StringconnectionString="mongodb://username:password@localhost:27017/myda......
  • Go 100 mistakes - Expecting deterministic behavior using select and channels
      funcmain(){messageCh:=make(chanint,10)disconnectCh:=make(chanstruct{},1)fori:=0;i<10;i++{messageCh<-i}gofunc(){for{select{casev:=<-messageCh:......