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

时间:2017-08-03 05:07:59

标签: java netty

我有两台服务器" A" (由我的朋友建造)和" B" (由我建造,使用Netty 4.1)。这台服务器" A"和" B"当客户端发送命令时会返回一些响应。我尝试使用简单的JAVA Client Socket服务器。下面是java客户端代码:

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(非netty)时,read()方法会给出如下输出:

48
48
57
56
48
50
49
48

但是,当我尝试连接到服务器" B" (使用netty),输出如下:

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

为什么会这样?顺便说一句,在服务器B中我使用ctx.write() and ctx.flush()以及如何使服务器B获得与服务器A相同的行为(不关闭连接,因此它不会返回-1)

编辑:其他信息

实际上在服务器" B"我正在使用ChannelInboundHandlerAdapterChannelOutboundHandlerAdapter。在做了一些实验后,问题出现在ChannelOutboundHandlerAdapter上。当我使用ctx.writeAndFlush()中的InboundAdapter发送回复时,套接字未关闭。但是当响应传递到OutboundAdapter然后我使用ctx.writeAndFlush() OutboundAdapter方法内的write(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()));
    } }

感谢

3 个答案:

答案 0 :(得分:0)

在Netty Server实现上,您可能需要更准确地通过ChannelHandlerContext处理读/写,例如,而不是使用ctx.write() ctx.channel().writeandflush()应该是更正确的方式,同时关闭{{1或ctx.channel().close()可以产生差异......

答案 1 :(得分:0)

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

答案 2 :(得分:0)

全天调试后,我找到了问题的根本原因。我不小心将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()并停止关闭套接字连接的服务器