1

DataInputStream.readUTFとDataOutputStream.writeUTFを使用するサーバーと通信しようとしています。

クライアントをセットアップするために通常のブートストラップコードを実行し、次のパイプラインファクトリを設定しました

    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
        }
    }

サーバーからメッセージを正常に受信できましたが、サーバーが「こんにちは」メッセージを受信して​​いません。何を見落としていたのかわからない。

また、送信されたブール値に注意してください。そのようなフィールドを追加して、スレッドの心配なしにそれらを操作できますか?

4

1 に答える 1

3
  • サーバーからメッセージを正常に受信できましたが、サーバーが「こんにちは」メッセージを受信して​​いません。何を見落としていたのかわからない。

サーバーからのメッセージは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
    }
}
  • また、送信されたブール値に注意してください。そのようなフィールドを追加して、スレッドの心配なしにそれらを操作できますか?

はい、フィールドを追加して状態を保存できます。また、スレッドの同期を考慮する必要はありません。

于 2011-02-09T04:02:14.143 に答える