【问题标题】:How to read/write with netty when other side is using readUTF/writeUTF?当对方使用 readUTF/writeUTF 时如何用 netty 读/写?
【发布时间】:2011-06-14 19:26:06
【问题描述】:

我正在尝试与使用 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
        }
    }

我成功地从服务器接收消息,但服务器没有收到我的“你好”消息。不知道我可能忽略了什么。

另外,请注意发送的布尔值,我可以添加这些字段并在没有线程问题的情况下使用它们吗?

【问题讨论】:

    标签: java netty


    【解决方案1】:
    • 我成功地从服务器接收消息,但服务器没有收到我的“你好”消息。不知道我可能忽略了什么。

    因为使用LengthFieldBasedFrameDecoder可以接收到来自服务器的消息,所以消息有一个长度字段。

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

    因此,服务器有可能期望接收到的消息具有长度字段。 如果长度字段是这样写的呢?

     +--------+---------------------+
     | 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
        }
    }
    
    • 另外,请注意发送的布尔值,我可以添加此类字段并使用它们而不用担心线程问题吗?

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

    【讨论】:

    • 我认为更简洁的方法是将 org.jboss.netty.handler.codec.frame.LengthFieldPrepender 添加到服务器管道中。这将自动将长度字段添加到传出数据包中。
    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    相关资源
    最近更新 更多