messageReceived(netty)未调用

时间:2013-03-14 21:21:21

标签: java netty protocol-buffers

我的来源 TestMessage - 是我的protobuf对象

        @Override
        public ChannelPipeline getPipeline() {
            ChannelPipeline next = Channels.pipeline();

        next.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
            next.addLast("protobufDecoder", new ProtobufDecoder(TestMessage.getDefaultInstance()));
        next.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
        next.addLast("protobufEncoder", new ProtobufEncoder());


            return next;
        }

@Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
        Channel ch = e.getChannel();
        if (ch.isOpen()) {

            TestMessage req = (TestMessage) e.getMessage();
            System.out.println(req.getMessage());
            ch.close();

        }
    }

发送

Socket fromserver = new Socket("localhost", 7283);

        PrintWriter out = new PrintWriter(fromserver.getOutputStream(), true);

        TestMessage.Builder message = TestMessage.newBuilder();

        message.setMessage("message .....");

        message.build();

        out.println(message);

        out.close();
        fromserver.close();

2 个答案:

答案 0 :(得分:1)

我有一个问题。 messageReceived()在哪里?

ProtobufVarint32FrameDecoder,ProtobufDecoder,ProtobufVarint32LengthFieldPrepender,ProtobufEncoder

四个类属于netty。但是messageReceived()方法必须位于CustomHandler类中。和班级

必须添加ChannelPipeline的下一个实例。

ex)如果我为messageReceived()创建一个ProtobufHandler类(扩展SimpleChannelHandler),

ChannelPipeline next = Channels.pipeline();
next.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
next.addLast("protobufDecoder", new ProtobufDecoder(TestMessage.getDefaultInstance()));
next.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
next.addLast("protobufEncoder", new ProtobufEncoder());

next.addLast("protobufHandler", new ProtobufHandler()); //add this. 
抱歉,我的英语水平有限。

答案 1 :(得分:0)

我一直在使用Netty 5.0.0并测试GitHub中的一些聊天示例,这些示例是为使用较旧的Netty版本而开发的。这些示例使用客户端中的以下代码发送字符串:

channel.write(msg + "\r\n");

我的当前Netty库从未调用过函数messageReceived。但是,在我将客户端代码更改为刷新字符串之后,它已经开始被调用,如下所示:

channel.writeAndFlush(msg + "\r\n");