Netty:保持服务器套接字打开后ctx.flush()

Netty:保持服务器套接字打开后ctx.flush()

问题描述:

我有两台服务器“A”(由我的朋友建造)和“B”(由我建造,使用Netty 4.1)。这个服务器“A”和“B”会在客户端发送命令时返回一些响应。我试图使用简单的JAVA客户端套接字服务器。下面是java客户端代码:Netty:保持服务器套接字打开后ctx.flush()

public class SocketClient 
{ 
    public void run() 
    { 
     try { 
      ClassLoader classLoader = getClass().getClassLoader(); 
      File file = new File(classLoader.getResource("request.txt").getFile()); 
      String content = new String(Files.readAllBytes(file.toPath())); 

      System.out.println("Connecting to server:8888"); 
      Socket socket = new Socket("myserver.com", 8888); 
      DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      out.write(content.getBytes()); 
      out.flush(); 

      while(true) { 
       int response = in.read(); 
       System.out.println(response); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

当客户端连接到服务器A(非网状),该read()方法给我这样的输出:

48 
48 
57 
56 
48 
50 
49 
48 

但是,当我尝试连接到服务器“B”(这是使用网状),输出是这样的:

48 
48 
57 
56 
48 
50 
49 
48 
-1 
-1 
-1 
-1 

为什么会发生这种情况?在服务器B的办法,我用ctx.write() and ctx.flush(),以及如何使服务器B获得与服务器A相同的行为(不关闭连接,所以它不会返回-1)

编辑:附加信息

其实在服务器“B”中,我使用ChannelInboundHandlerAdapterChannelOutboundHandlerAdapter。做了一些实验后,问题出现在ChannelOutboundHandlerAdapter。当我使用InboundAdapterctx.writeAndFlush()发送响应时,套接字未关闭。但是,当响应传递到OutboundAdapter,然后我发送回应使用ctx.writeAndFlush()OutboundAdapterwrite(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)方法。关闭套接字

这里是我OutboundAdapter的样本:

public class OutboundHandler extends ChannelOutboundHandlerAdapter { 

    private static final Logger logger = LogManager.getLogger(OutboundHandler.class); 

    //Sending or forwarding message to channel which is already configured 
    //condition is depends on which model instance 
    //packaging is worked on its packager class 
    @Override 
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception 
    { 
     String response = "Response form OutboundHandler"; 
     ctx.writeAndFlush(Unpooled.copiedBuffer(response.getBytes())); 
    } } 

感谢

经过全天调试,我发现问题的根本原因。我不小心把ctx.close()某处我InboundAdapter,所以当我将消息传递到OutboundAdapter和冲洗消息给客户端,将关闭连接

try { 
    //some code 
} 
} catch (Exception ex) { 
     logger.error(ex); 
     ErrorData error = new ErrorData(); 
     error.setCode("99"); 
     error.setMessage("General System Error"); 

     //pass the message to OutboundAdapter 
     ctx.writeAndFlush(error); 
} finally { 
    ctx.close(); 
} 

所以,我只需要去除ctx.close()和服务器从停止关闭socket连接

在Netty的服务器实施,也许你必须处理读/通过ChannelHandlerContext更正确,例如写作,而不是使用ctx.write()ctx.channel().writeandflush()应该是更合适的方式,也是在成交ctx.channel().close()ctx.channel().close().sync()可以使不同的使用......

+0

'ctx.writeAndFlush()'和'ctx.channel.writeAndFlush()'有什么区别?我的问题是netty总是在'writeAndFlush()'后自动关闭连接,所以客户端无法发送另一条消息到服务器。 –

+0

虽然他们应该在实现相同的ChannelOutboundInvoker接口的两种方式相同,但您的问题我投资netty的一些例子,可能是有用的https://developer.jboss.org/wiki/NettyExampleOfPingPongUsingObject –

+0

我使用netty的方式。 io(版本4.x)而不是jboss netty(版本3。x),我不知道他们是否有显着差异。但谢谢你的建议......哦,我试图改变'ctx.write(); ctx.flush()'转换为'ctx.channel()。writeAndFlush()',但套接字仍然自动关闭。 –

您不检查流结束,所以您无休止地回应它。 read()返回。核实。它在流结束时返回-1。这就结束了。菲尼斯。 Finito。停在那里。不要打印它。不要继续阅读。不要通过GO。不要收200美元。