0

これは netty ソース パッケージの例です。writeindex を出力します。1 つのクライアントをテストします。知りたいです。

public class DiscardClientHandler extends SimpleChannelUpstreamHandler {
...
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
    // Send the initial messages.
    generateTraffic(e);
}
@Override
public void channelInterestChanged(ChannelHandlerContext ctx, ChannelStateEvent e) {
    // Keep sending messages whenever the current socket buffer has room.
    generateTraffic(e);
}

private void generateTraffic(ChannelStateEvent e) {
    // Keep generating traffic until the channel is unwritable.
    // A channel becomes unwritable when its internal buffer is full.
    // If you keep writing messages ignoring this property,
    // you will end up with an OutOfMemoryError.
    Channel channel = e.getChannel();
    while (channel.isWritable()) {
        ChannelBuffer m = nextMessage();
        if (m == null) {
            break;
        }
        channel.write(m);
    }
}

上記はクリントコードです...

public class DiscardServerHandler extends SimpleChannelUpstreamHandler {
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    // Discard received data silently by doing nothing.
ChannelBuffer cb = (ChannelBuffer) e.getMessage();
    transferredBytes += cb.readableBytes();

    System.out.println("-=-=- " + transferredBytes + "-=-" + cb.writerIndex() + "-=- " + e.getMessage().toString());
    }
-=-=- 679039232-=-65536-=- BigEndianHeapChannelBuffer(ridx=0, widx=65536, cap=65536)
-=-=- 679072768-=-33536-=- BigEndianHeapChannelBuffer(ridx=0, widx=33536, cap=33536)
-=-=- 679105792-=-33024-=- BigEndianHeapChannelBuffer(ridx=0, widx=33024, cap=33024)
...
-=-=- 679298816-=-256-=- BigEndianHeapChannelBuffer(ridx=0, widx=256, cap=256)
-=-=- 679299072-=-256-=- BigEndianHeapChannelBuffer(ridx=0, widx=256, cap=256)
-=-=- 679299328-=-256-=- BigEndianHeapChannelBuffer(ridx=0, widx=256, cap=256)
...
-=-=- 679600640-=-65536-=- BigEndianHeapChannelBuffer(ridx=0, widx=65536, cap=65536)
-=-=- 679634176-=-33536-=- BigEndianHeapChannelBuffer(ridx=0, widx=33536, cap=33536)
-=-=- 679640576-=-6400-=- BigEndianHeapChannelBuffer(ridx=0, widx=6400, cap=6400)
....

私は 1 つのクライアントをテストします。知りたいのは:

  1. writeIndex が 256 の場合もあれば 65536 の場合もあるのはなぜですか?
  2. なぜ最大は 65536 なのですか?

private ChannelBuffer nextMessage() { return ChannelBuffers.wrappedBuffer(content);// コンテンツ サイズは 256 } 1 つのクライアントに同じチャネル バッファ、writeindex 増加シーケンスを使用させたいですか? 私は正しいですか?

4

1 に答える 1

1

これは、読み取り操作で「読み取る」ことができたデータの量によって異なります。そのため、常に異なる場合があります。65536 は 64k であり、これはアプリケーションの RECV_BUF サイズである可能性が最も高いため、「最大」です。

于 2013-01-27T10:23:35.797 に答える