netty LoggingHandler在一个帧中打印多个堆栈消息,并且计算的长度太大

时间:2017-05-09 02:54:16

标签: java websocket netty java-websocket

我已经构建了一个WebSocket客户端,以便将相同的消息发送到echo服务器并计算接收的字节数。服务器返回如下消息:

  

WebSocketData [收到消息]

但是当我检查LoggingHandler打印的日志时,echo服务器发送的接收消息会粘在一起。因此,当我在LoggingHandler之前放置一个BytesCountingHandler时,一条消息的计数结果太大了。

我想问:我做错了吗?

我的初级课程如下:

连接并发送消息:

b.group(group)
                .channel(NioSocketChannel.class)
                .handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel ch) {
                        ChannelPipeline p = ch.pipeline();
                        if (sslCtx != null) {
                            p.addLast(sslCtx.newHandler(ch.alloc(), host, port));
                        }
                        p.addLast(
                                new BytesCountHandler(),
                                new LoggingHandler(LogLevel.INFO),
                                new HttpClientCodec(),
                                new HttpObjectAggregator(8192),
                                handler);
                    }
                });
        Channel ch = b.connect(uri.getHost(), port).sync().channel();
        handler.handshakeFuture().sync();

        for (;;) {
            String msg = "hello websocket";
            WebSocketFrame frame = new TextWebSocketFrame(msg);
            ch.writeAndFlush(frame);
        }

BytesCountHandler:

public class BytesCountHandler extends ChannelDuplexHandler {

@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
    super.write(ctx, msg, promise);
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    System.out.println(countMessage(msg));
    super.channelRead(ctx, msg);
}

private int countMessage(Object msg) {
    if (msg instanceof ByteBuf) {
        return countBytes((ByteBuf) msg);
    } else if (msg instanceof ByteBufHolder) {
        return countByteBufHolder((ByteBufHolder) msg);
    }
    return 0;
}

private int countBytes(ByteBuf buf) {
    return buf.readableBytes();
}

private int countByteBufHolder(ByteBufHolder bufHolder) {
    return countBytes(bufHolder.content());
}

没有LoggingHandler的日志:

129
WebSocket Client connected!
320
96
32
32
32
192
160
320
96
448
448

使用LoggingHandler进行日志记录:

...
WebSocket Client connected!
五月 09, 2017 10:08:33 上午 io.netty.handler.logging.LoggingHandler logMessage
信息: [id: 0xed597528, /10.128.7.104:20558 => /10.128.106.20:8085] WRITE(21B)
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 81 8f 1f 79 b5 46 77 1c d9 2a 70 59 c2 23 7d 0a |...y.Fw..*pY.#}.|
|00000010| da 25 74 1c c1                                  |.%t..           |
+--------+-------------------------------------------------+----------------+
五月 09, 2017 10:08:33 上午 io.netty.handler.logging.LoggingHandler flush
信息: [id: 0xed597528, /10.128.7.104:20558 => /10.128.106.20:8085] FLUSH
五月 09, 2017 10:08:33 上午 io.netty.handler.logging.LoggingHandler logMessage
信息: [id: 0xed597528, /10.128.7.104:20558 => /10.128.106.20:8085] RECEIVED(32B)
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|00000010| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
+--------+-------------------------------------------------+----------------+
...
五月 09, 2017 10:08:33 上午 io.netty.handler.logging.LoggingHandler logMessage
信息: [id: 0xed597528, /10.128.7.104:20558 => /10.128.106.20:8085] RECEIVED(512B)
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|00000010| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
|00000020| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|00000030| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
|00000040| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|00000050| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
|00000060| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|00000070| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
|00000080| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|00000090| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
|000000a0| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|000000b0| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
|000000c0| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|000000d0| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
|000000e0| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|000000f0| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
|00000100| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|00000110| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
|00000120| 81 1e 57 65 62 53 6f 63 6b 65 74 44 61 74 61 5b |..WebSocketData[|
|00000130| 68 65 6c 6c 6f 20 77 65 62 73 6f 63 6b 65 74 5d |hello websocket]|
...

我希望我已经清楚地描述了

由于

这是

1 个答案:

答案 0 :(得分:0)

您正在计算低级网络数据,而不是帧的内容。

因为您想要计算和打印websocket框架的内容,而不是HTTP&amp;的包装器。在WS层中,您应该将日志记录处理程序向下移动:

p.addLast(                              
    new HttpClientCodec(),
    new HttpObjectAggregator(8192),
    new LoggingHandler(LogLevel.INFO),
    handler);