0

我的源 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();
4

2 回答 2

1

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

ProtobufVarint32FrameDecoder、ProtobufDecoder、ProtobufVarint32LengthFieldPrepender、ProtobufEncoder

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

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

例如)如果我为 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. 

对不起,我的英语水平有限。

于 2013-03-15T05:40:28.423 回答
0

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

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

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

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

于 2015-01-28T08:39:44.947 回答