java - 当另一方使用 readUTF/writeUTF 时如何用 netty 读/写?

标签 java netty

我正在尝试与使用 DataInputStream.readUTF 和 DataOutputStream.writeUTF 的服务器通信。

我做了通常的引导代码来设置我的客户端,并设置了以下 pipelinefactory

    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    new LengthFieldBasedFrameDecoder(65536, 0, 2),
                    new StringDecoder(CharsetUtil.UTF_8),
                    new StringEncoder(CharsetUtil.UTF_8),
                    new MyClientHandler());
        }
    });

在扩展 SimpleChannelUpstreamHandler 的 MyClientHandler 中,我有以下内容:

    boolean sent = false; //is this thread safe?

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
        logger.log(Level.INFO, e.getMessage().toString());
        e.getChannel().write("Hello over there!");

        if(!sent){
             //do something and set sent
        }
    }

我设法成功地从服务器接收消息,但服务器没有收到我的“你好,那边”消息。不确定我可能忽略了什么。

另外,注意发送的 boolean 值,我可以添加这样的字段并使用它们而不用担心线程问题吗?

最佳答案

  • 我设法成功地从服务器接收消息,但服务器没有收到我的“你好,那边”消息。不确定我可能忽略了什么。

由于可以使用 LengthFieldBasedFrameDecoder 接收来自服务器的消息,因此该消息具有长度字段。

 +--------+----------+
 | Length | Message  |
 +--------+----------+

因此,服务器有可能期望收到的消息具有长度字段。 length域如果这样写怎么办?

 +--------+---------------------+
 | 0x0011 | "Hello over there!" |
 +--------+---------------------+

[样本]

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    logger.log(Level.INFO, e.getMessage().toString());
    byte[] message = "Hello over there!".getBytes("UTF-8");

    ChannelBuffer buf = ChannelBuffers.buffer(message.length + 2);
    buf.clear();
    short len = (short)message.length;
    buf.writeShort(len);
    buf.writeBytes(message);
    e.getChannel().write(buf);

    if(!sent){
        //do something and set sent
    }
}
  • 另外,请注意发送的 boolean 值,我可以添加此类字段并使用它们而不用担心线程问题吗?

是的,您可以添加字段来存储一些状态。 而且你不需要考虑线程的同步。

关于java - 当另一方使用 readUTF/writeUTF 时如何用 netty 读/写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787286/

相关文章:

java - 将字节数组转换为字符串,然后再次将其返回到字节数组

netty - 代表连接到 netty 服务器的客户端

java - 等待API服务器的响应

java - Spring Boot中函数参数的Concat @Query值

Java IO vs NIO,真正的区别是什么?

java - 为什么 Netty 客户端表现得像僵尸?

java - Instrument Netty 的 EventLoop 用于确定性执行计划任务

java - Hazelcast 客户端单例

java - 从同一页面开始单元格,iText

java - Java中线程安全的创建和删除文件