gpt4 book ai didi

Java - 奇怪的挂套接字?

转载 作者:搜寻专家 更新时间:2023-10-31 19:42:19 24 4
gpt4 key购买 nike

我有一个带有 Java 服务器的客户端-服务器应用程序。它工作得非常完美,只是在很长一段时间后,突然之间, socket 一直挂着。这个套接字只是众多套接字中的一个,其余套接字似乎还可以,但是一旦到达套接字,服务器就不会越过发送线。这些是代码的相关部分:

Socket socket; // A normal socket
out = new PrintWriter(socket.getOutputStream(), true); // The outstream
out.println(msg + "\0"); // This command is used to send stuff, msg is a String

没有抛出异常,线应用程序似乎根本没有越过线:

out.println(msg + "\0");

我确实知道 String 是一个很好的字符串,因为在这个字符串可以正常发送之前还有 4 或 5 个其他套接字。另请注意,据我所知,此套接字在突然挂起之前可以发送数百条消息。有谁知道我应该寻找什么样的错误?

最佳答案

有很多原因可能导致这种情况,但听起来您可能在 TCP 级别遇到了背压。

通常,当您在套接字上发送数据时,它只是被缓冲并且发送调用(在您的情况下,println()flush())可以在之前返回数据实际上被发送到网络。可能是您之前在此套接字上的所有写入都只是缓冲到本地 SO_SNDBUF而你只是把它填满了。

(1) 您能否使用 tcpdump 或 Wireshark 跟踪它并找到挂起的确切连接(我知道这对许多连接来说很难)?检查程序挂起时的 TCP 窗口大小将告诉您更多有关您是在 Java 本身还是在网络级别阻塞的信息。

(2) 转储堆栈并将其张贴在这里。 Java Sockets 有一个内部锁来防止两个线程同时写入它们。您确定在您尝试写入时只有一个线程正在访问该套接字吗?

你肯定想尝试做一个

$ jstack <PID>

当它被卡住以准确查看它卡在哪里时,以及写入线程是否正在尝试获取任何锁。

关于Java - 奇怪的挂套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1916440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com