【问题标题】:NETTY 4.1.4: TCP Socket Server which replies back towards clients after processing requestsNETTY 4.1.4:处理请求后回复客户端的 TCP 套接字服务器
【发布时间】:2017-03-17 20:08:05
【问题描述】:

我是 Netty 的新手,打算创建一个 tcp 套接字服务器,它读取每个客户端的信息并在立即处理请求之前回复客户端,即当消息进入 ChannelInboundHandlerAdapter 类的重写 channelRead 方法时,是一种对客户端的确认。

请指导我实现上述指定目标。 我目前正在尝试基本的 netty 4.1.4 回显服务器示例,但是我希望服务器向客户端发送回确认,所以我更新了 channelread 方法如下:

@Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        ctx.write(msg);
        ChannelFuture cf = ctx.channel().write("FROM SERVER");
        System.out.println("Channelfuture is "+cf);
    }

得到的输出如下:

Channelfuture is DefaultChannelPromise@3f4ee9dd(failure: java.lang.UnsupportedOperationException: unsupported message type: String (expected: ByteBuf, FileRegion))

我了解它期望 bytebuf 的错误,但我该如何实现呢?另外,这个方法是否能够向客户端发送确认

【问题讨论】:

  • 您需要使用 Netty 3,还是可以选择 4?建议查看并使用示例。 github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/…
  • 嗨,我只需要一个更稳定的版本,所以选择了 netty 3。如果版本 4 的任何更新是稳定的,我会在需要时选择它。我确实看过一些例子并且能够理解一些事情。但是,我被这个简单的事情困住了。
  • 我对 3 不熟悉,但如果你在 4 中尝试一下,我可能会有所帮助。根据来自 Netty 项目的 Trustin 的说法,4.0 是稳定的,而 3.x 已被弃用:stackoverflow.com/questions/30457648/…
  • 我认为现在有必要改变我的问题。

标签: sockets tcp server netty


【解决方案1】:

您可以使用String.getBytes(Charset)Unpooled.wrappedBuffer(byte[]) 转换为ByteBuf。

ChannelFuture cf = ctx.channel()
    .write(Unpooled.wrappedBuffer("FROM SERVER".getBytes(CharsetUtil.UTF_8)));

另请注意,ctx.channel().write(...); 可能不是您想要的。请考虑使用ctx.write(...);。不同之处在于,如果您的处理程序是 ChannelDuplexHandler,它会在您执行channel().write() 时收到写入事件。使用 ctx 而不是 channel 将从管道中的处理程序点发送写入,而不是从管道末端发送,这通常是您想要的。

【讨论】:

  • 非常感谢克里斯。我接受了您使用 ctx 而不是 channel 写信给客户的建议。我也有一些其他的查询,下面的代码也是对客户的一种确认吗?字节 [] 请求 = 新字节 [] { 0x01 }; ctx.write(ChannelBuffers.wrappedBuffer(request));
  • 不确定您所说的确认是什么意思。原始的 echo 代码通过写回读取的内容来确认每次读取,并在 readComplete 触发时刷新。
  • 好的。感谢您提供的步骤的建议和解释,您提供了很大的帮助!
  • 我实际上认为确认要么必须是向客户端发送的一些响应,要么是在 tcp 握手过程中向客户端发送的 ACK{0x01} 字节。方法 chnnelRead 中的这个对象 msg(作为参数)必须是从字符串发送的消息,但它是 SimpleLeakAwareByteBuf 类型。我怎样才能把它读成一个字符串?我尝试了多种方式,即使用 getbytes。可读字节方法等,似乎在阅读时我们需要为数据读取设置一些限制。这是以字符串形式读取数据的最佳方式
  • 我找到了相同 public void channelRead(ChannelHandlerContext ctx, Object msg) { ByteBuf buff = (ByteBuf) msg​​;字节[] 字节;整数偏移量; int 长度 = buff.readableBytes(); if (buff.hasArray()) { 字节 = buff.array();偏移量 = buff.arrayOffset(); } else { 字节 = 新字节 [长度]; buff.getBytes(buff.readerIndex(), 字节);偏移量 = 0; } String str = new String(bytes, StandardCharsets.UTF_8); System.out.println("收到消息"+str);
猜你喜欢
  • 1970-01-01
  • 2019-06-06
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
相关资源
最近更新 更多