- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的程序运行了一段时间(大约 20 秒),然后它发送的消息越来越少,直到停止。我做了一个线程转储,它指向线程停止的以下代码行:
if(s.isClosed() || !s.isConnected() || s.isInputShutdown() || s.isOutputShutdown() || out == null || out.checkError()) {
这是我线程转储的一部分
"class xxx.xxx.xxx" prio=10 tid=0x000000000200d800 nid=0x6e7f waiting for monitor entry [0x00007f63172b6000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.io.PrintWriter.flush(PrintWriter.java:291)
- waiting to lock <0x00000000ec810218> (a java.io.BufferedWriter)
at java.io.PrintWriter.checkError(PrintWriter.java:330)
此线程转储信息指出问题出在 Printwriter.checkError() 中。但我不明白为什么它会停在这里。
下面是上下文中的代码。 (接收者是一个 Map<Socket, PrintWriter>
)
public void parseMessage(final byte[] bytes) {
synchronized (receivers) {
for (final Socket s : receivers.keySet()) {
final PrintWriter out = receivers.get(s);
if(s.isClosed() || !s.isConnected() || s.isInputShutdown() || s.isOutputShutdown() || out == null || out.checkError()) {
receivers.remove(s);
failedToConnect(s.getInetAddress().getHostAddress(), s.getPort());
continue;
}
queue.add(out, bytes);
}
}
}
1 月 14 日(10:00 GMT+1)更新:
替换了 PrintWriter
用BufferedWriter
1 月 14 日 (16:00 GMT+1) 更新:
我又进行了一些测试,结果证明是某些网络/阅读器之间的某种通信问题导致了麻烦。该应用程序正在向其内部网络中的某些阅读器发送数据,并向某些外部网络(通过互联网)中的某些阅读器发送数据。究竟是什么原因导致这一点仍然未知,但有一些线索。重新启动几次后,我可以看到两个网络之间的连接未关闭,因此连接保持打开状态。我仍然不知道这里到底发生了什么,但在我看来这是某种网络问题。在服务器端,连接保持在“FIN_WAIT1”,在阅读器端保持“ESTABLISHED”。看起来阅读器不会发出关闭连接的信号,即使已发送关闭连接的信号也是如此。
最佳答案
if(s.isClosed() || !s.isConnected() || s.isInputShutdown() || s.isOutputShutdown() || out == null || out.checkError())
这是一系列几乎无用的测试。
out
为 null,则您不应出现在这部分代码中。checkError()
很好,但您根本不应该在网络上使用 PrintWriter
,因为它会吞噬异常。最好使用 BufferedWriter
并让异常告诉您发生错误的情况,而不是像您在这里所做的那样在下一次写入时告诉您。您还需要了解,Socket.isClosed()
仅告诉您您 是否已关闭Socket。
同样, Socket.isConnected()
仅告诉您已连接 Socket,
或已通过构造函数或 ServerSocket.accept()
接收到它。 isInputShutdown()
和 isOutputShutdown()
也是如此。它们只会告诉您对 Socket 做了什么。
这些方法都不会告诉您关于连接 状态的任何信息。
This thread dump info points out that the problem lies in Printwriter.checkError(). But i can't understand why it would stop here.
因为,正如堆栈跟踪还告诉您的那样,它正在调用 flush()。
如果阻塞,则意味着您已经超出读取器的范围,并且 TCP 正在等待他读取一些数据以释放他的套接字接收缓冲区中的缓冲区空间以及您的套接字发送缓冲区中的缓冲区空间。在此之前,底层的 send()
将被阻塞。您对此无能为力,只能加快阅读速度。
关于java - 线程一直卡在 Socket/Printwriter 交互上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14860277/
在这个程序中,第三个字符串永远不会被打印出来。为什么? (此 Java 程序在 Ubuntu 10.10 上的 Eclipse Indigo 上运行。) import java.io.PrintWri
我已经使用 Java 执行任务和支持工具有一段时间了,但我从未弄清楚如何在一个类中使用 PrintWriter ,然后我可以从另一个类中使用它,例如,我我有几个要解析的 XML 文件,然后从单个输入源
Java PrintWriter 方法printf 和format 之间有什么区别吗? 文档说 printf 是一种方便的方法,但如果它的行为与 format 完全一致,所以我不明白它有什么方便之处。
我正在处理一个服务器-客户端程序集,但现在我遇到了协议(protocol)问题,因为 println 语句末尾的新行混淆了元数据。 换句话说,我需要打印到 PrintWriter,末尾不带新行。我尝试
我想知道有没有可能做 new PrintWriter(new BufferedWriter(new PrintWriter(s.getOutputStream, true))) 在 Java 中,s
PrintWriter(OutputStream out) 此方法不会自动刷新行。 PrintWriter(OutputStream out, boolean autoFlush) 此方法执行自动行冲
我只是想将二维数组“拼图”写入文件。我有一个双 for 循环,它读取数组中的每个“char”值,并将它们写入文件。我似乎无法在我的代码中找到错误。该文件说它在我运行程序时已被修改,但它仍然是空白的。谢
我正在尝试从数据库写入一个大文件文本,大约 200 万行。我观察到,当 PrintWriter 打印 (println()) 行时,文件大小始终为 0 字节。流关闭后文件具有大小数据。它导致所有数据首
public PrintWriter(OutputStream out, boolean autoFlush) : out - An output stream autoFlush - A boole
我的PrintWriter对象编写器的print()方法不起作用,我导入了所有适当的类,但CSV文件一直显示为空白。谁能告诉我为什么? public class StateStats { st
我在这里遇到一个问题:我让这个程序打印 0 到 1000 之间的所有偶数,但是在 friend 做了一些更改之后,它现在只打印“0”。我已经使用它一段时间了,无法弄清楚这是循环问题还是打印机问题。我从
try{ pw = new PrintWriter("C:\\Users\\SDSAD\\Desktop\\java\\file.txt"); }catch(Exception exc){
与我的问题相关的代码功能的主要摘要:该代码采用国会成员数组并以两种不同的方法对它们进行排序;一种按名字排序,一种按平均支持率排序。然后,代码将两个新排序的数组输出到 txt 文件中。 我正在处理的问题
我正在尝试解析一些链接,然后将信息存储在文本文件中,我拥有应在列表中解析的所有链接,但是在解析和存储有关 100 个链接的信息后,我收到了我真的无法理解的错误为什么会发生这种情况,这是我的代码: fo
我真的不明白问题出在哪里。我想将字符打印到文本文件中,并且我使用 printWriter 来执行相同的操作。如果文件有一个“;”,我想用一个新行替换它,这就是我正在做的, public static
我的问题非常简单,如果我有一个长字符串,其中有很多“\n”换行符,即: strings = "Hey\nThere\nFriend\n" 并使用 Java 中的 PrintWriter 执行以下操作:
我有一个将信息存储到二叉树中的程序。 我正在尝试使用 PrintWriter 将所有信息打印到文本文件中,这在以前的情况下对我有用,但这次我没有运气。 必须通过对象在节点中调用信息。我已经调试并确定树
This question already has answers here: PrintWriter writes only partial text (5 个回答) 7 个月前关闭。 我在某个网站
您好,正在开发一个将数据写入文件的小程序。我使用 if else 语句进行验证,因此我需要在单独的方法中使用 PrintWriter 和 FileWriter 类/声明。然后我使用主类的构造函数调用此
我需要打印 100 多行数据和统计数据。我正在使用: PrintWriter p = new PrintWriter(fileName); 之所以大约有 100 行,是因为我需要打印到系统和文件(每个
我是一名优秀的程序员,十分优秀!