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

4 つのクラスが netty にあります。ただし、me​​ssageReceived() メソッドは 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 を使用しており、古いバージョンの Netty を使用するために開発された GitHub のチャットの例をいくつかテストしています。これらの例では、クライアント側で以下のコードを使用して文字列を送信しました。

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

関数 messageReceived は、現在の Netty ライブラリで呼び出されたことはありません。ただし、クライアント コードを次のように文字列をフラッシュするように変更した後、呼び出されるようになりました。

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

于 2015-01-28T08:39:44.947 に答える