当前位置: 首页 > 知识库问答 >
问题:

Netty:在ctx之后保持服务器套接字打开。刷新()

郭炳
2023-03-14

我有两个服务器“A”(由我的朋友构建)和“B”(由我构建,使用Netty 4.1)。当客户端发送命令时,此服务器“A”和“B”会返回一些响应。我尝试使用简单的JAVA客户端套接字访问该服务器。以下是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()和ctx。flush()以及如何使服务器B获得与服务器A相同的行为(不关闭连接,因此不会返回-1)

编辑:其他信息

实际上,在服务器“B”中,我使用的是ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter。在做了一些实验后,问题出现在ChannelOutboundHandlerAdapter上。当我使用ctx发送响应时。writeAndFlush()从InboundAdapter中,套接字未关闭。但是当响应被传递到OutboundAdapter时,然后我使用ctx发送响应。writeAndFlush()内部外部适配器写入(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个答案

裘嘉木
2023-03-14

经过一整天的调试,我找到了问题的根本原因。我不小心把ctx.close()放在了我的InbnAdapter中的某个地方,所以当我将消息传递到OutbnAdapter并将消息刷新到客户端时,它将关闭连接

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(),服务器停止关闭套接字连接

燕烨
2023-03-14

你们并没有检查流的结尾,所以你们在无休止地重复它read()返回一个值。检查一下。它在流的末尾返回-1。结束了。菲尼斯。菲尼托。停在那里。不要打印它。不要一直看书。不要传球。不要收取200美元。

海宁
2023-03-14
匿名用户

在Netty服务器实现上,例如,您可能必须通过ChannelHandlerContext更恰当地处理读写操作,而不是使用ctx。write()ctx。通道()。writeandflush()应该是更合适的方式,也是在结束使用ctx时。通道()。close()或ctx。通道()。关闭()。sync()可能会产生差异。。。

 类似资料:
  • 我编写了简单的服务器/客户端程序,其中客户端将一些硬编码数据以小块形式发送给服务器程序,服务器程序正在等待数据,以便将其打印到终端。在客户端,我在循环中调用send(),同时有更多的数据要发送,而在服务器上,我使用read()执行同样的操作,即返回的字节数为 如果我在完成发送后专门在客户端的套接字上调用close(),那么这个示例非常有效,但如果我不这样做,服务器将不会实际退出read()循环,直

  • 我正试图用Netty开发以下用例: 客户端连接到上的中间服务器(端口 8900)。 客户端将具有配置的处理器请求发送到另一台计算机。 第 3 台计算机根据配置启动处理器。 处理器连接到根据配置中标识的端口(例如端口 8901)启动处理器的同一服务器。 服务器现在根据两者之间共享的匹配唯一哈希绑定客户端和处理器。 将为每个新的客户端连接创建新处理器。 客户端连接不是问题。我有一个处理这些请求的客户端

  • 我注意到netstat的套接字是打开的: 这是意料之中的行为吗?我是否需要显式地将连接头值设置为close以防止这种情况发生?

  • 我在netty server应用程序中面临资源问题。 无法看到与Netstat的任何打开或挂起的连接... 我使用ReadTimeoutHandler关闭未使用的连接,并使用以下exceptionHandler代码: 服务器引导程序如下所示: 更新2:根据请求,我将日志处理程序移到ReadTimeouthandler前面,以下是日志。客户端通常断开连接的情况: 客户端不断开连接的情况: 所以收盘前

  • 由于我正在构建一个服务器,它应该同时运行许多连接,我试图使效率,而不是让任何幽灵连接打开。 在这里,我实现了一个“keep alive”方法,我的问题如下:如果我的服务器中打开了600个打开的连接,显然服务器需要时间在所有线程之间运行以检查keep alive,甚至从客户机获得keep alive消息-检查是否发送了keep alive消息的适当时间应该是多少。我想大约2分钟--所以服务器想要忙,

  • 问题内容: 我是网络编程的新手。我有兴趣通过Java服务器和C客户端之间的套接字建立网络连接并保持连接无限打开的可能吗?我想保持连接打开状态以在客户端之间交换XML数据。 问题答案: 从理论上讲,可以无限期地打开服务器套接字;但是,使用客户端套接字是不可能的。主要原因是因为客户端套接字取决于处理数据的服务器端套接字,并且服务器套接字可能会关闭连接。 尽管可以无限期地保持连接打开,但实际情况通常会确