2013-10-09 3 views
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 = истинная и, когда первый байт с удаленным 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); 
     } 
    } 
} 

Задержка незаметна - я даже не мог сказать, что я ее вообще маршрутизировал. Что я делаю не так?

ответ

0

Не уверен относительно задержки, но лучше начать запись на канал после метода обработчика channelActive(). Это гарантирует, что канал настроен, и канал канала сконструирован и готов.

Смежные вопросы