- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个带有 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/
我在从 python 调用共享 c 库时遇到问题。库加载正常,公开的 3 个函数之一是可调用的,并且按预期工作;但是,当向库中添加另一个函数时,我发现其他两个不起作用。发生的事情是 python 卡在
我在使用 ImageIcon().GetImage() 时遇到问题 奇怪的是,它有时可以工作并向我显示带有 map 的窗口,而有时却不能。它也可以在其他计算机上完美运行,但不能在我的计算机上运行! 我
我们有时会遇到一个问题,即我们在 IIS 中有许多具有以下状态的请求:RequestAcquireState。 我们正在使用 SqlSessionStateStore 来管理 session 。当我们
我有一个 MobileSubstrate 插件,可以挂接跳板(不在实际的 objective-c 代码中,而是在 plist 中)。它包含一个 UIWebView,它加载一个 NSURLRequest
我正在尝试使用 Django 1.7,并按照说明进行操作 here .不幸的是,该过程似乎因以下输出而挂起: [Watt] ~/Projects/proj/proj master > python p
我正在使用 HDP 2.3.0.0-2557,我正在尝试运行如下所示的配置单元查询: beeline> !connect jdbc:hive2://localhost:10000 Connecting
我正在尝试使用 mxnet 设置 AWS Greengrass,以便在 Raspberry Pi 上进行机器学习。 当从 https://docs.aws.amazon.com/greengrass/
我是一名优秀的程序员,十分优秀!