0

私は Netty で透過的なリバース プロキシを作成しましたが、接続が確立されてから最初のバイトが通過するまでの間に、かなりの遅延 (約 700 ミリ秒) があるようです。

    b.connect(remoteIp, remotePort).addListener(new ChannelFutureListener() {
        public void operationComplete(ChannelFuture future) throws Exception {
            ByteBuf buff = future.channel().alloc().buffer();
            if (IS_PING) {
                buff.writeByte(-2);
                buff.writeByte(1);
                buff.writeByte(250);
                writeString(buff, "MC|PingHost");
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                DataOutputStream flush = new DataOutputStream(bos);
                flush.writeByte(protoVersion);
                writeString(flush, remoteIp);
                flush.writeInt(port);
                buff.writeBytes(bos.toByteArray());
                flush.close();
            } else {
                buff.writeByte(2);
                buff.writeByte(protoVersion);
                writeString(buff, username);
                writeString(buff, host);
                buff.writeInt(port);
            }
            future.channel().writeAndFlush(buff);
            RelayHandler.this.hasConnection = true;
            RelayHandler.this.outboundChannel = future.channel();
        }

RelayHandler.this.hasConnection = true という行と、リモート IP からの最初のバイトが到着するまでの遅延は、約 600 ミリ秒です。

しかし、このように単純な「プロキシ」を書くと、

public static void main(String[] args) throws Exception {
    ServerSocket socket = new ServerSocket(25565);
    Socket client = socket.accept();
    DataInputStream dis = new DataInputStream(client.getInputStream());
    DataOutputStream dos = new DataOutputStream(client.getOutputStream());
    Socket out = new Socket("5.9.106.20", 25565);
    DataOutputStream outboundDos = new DataOutputStream((out.getOutputStream()));
    DataInputStream outboundDis = new DataInputStream(out.getInputStream());
    while (true) {
        if (dis.available() > 0) {
            byte[] buff = new byte[dis.available()];
            dis.read(buff);
            outboundDos.write(buff);
        }
        if (outboundDis.available() > 0) {
            byte[] buff = new byte[outboundDis.available()];
            outboundDis.read(buff);
            dos.write(buff);
        }
    }
}

遅延は目立たない - 私はそれをルーティングしていることさえまったくわかりませんでした. 私は何を間違っていますか?

4

1 に答える 1

0

遅延についてはわかりませんが、ハンドラのメソッド channelActive() が呼び出された後にチャネルへの書き込みを開始することをお勧めします。これにより、チャネルがセットアップされ、チャネルのパイプラインが構築されて準備が整っていることが保証されます。

于 2013-10-09T08:47:52.877 に答える