1

我正在尝试从 5 个串行连接的设备中读取数据。如果设备健康,我的 Java 代码运行良好,否则将inputstream.read()挂起程序并且不允许进一步执行。

我曾尝试使用inputstream.available(), BufferedInputStream... 但没有任何效果。

我想要做的是:如果设备没有响应我的代码,它应该自行结束并让控件转到主程序,然后它将转到下一个设备。套接字在一个轮询周期内保持打开状态。

Socket es = new Socket("10.12.90.153",4001); 
OutputStream osnew= es.getOutputStream(); 
InputStream isnew = new BufferedInputStream(es.getInputStream()); 

这是在任务程序中完成的,然后我以一秒的间隔传递到每个设备以进行进一步的操作osnew。写入设备响应isnew的一些数据。osnew然后我从isnew...This 中读取程序挂起的位置。

4

3 回答 3

0

您如何从设备读取数据?我假设您正在使用某种形式的 FileInputStream 来执行此操作。该类看起来适合从文件系统读取给我,但是可能会长时间阻塞的设备可能会锁定 Java 线程,直到设备响应为止。您需要对设备发出某种定时读取请求,而我不知道有任何 Java 类可以做到这一点。

我最好的建议是编写一些 JNI 代码,当你的设备停止响应时,它们可以很好地交流并且不会阻塞。这就是我在与 USB 设备通话时所做的。如果我正在编写此代码(对于 Linux),我将使用 select(它有一个时间段参数)来等待来自任何设备的输入。

于 2013-06-19T12:32:35.240 回答
0

InputStream旨在阻止您尝试读取数据并且没有可用的数据。您可以调用该available()方法来查看是否有任何数据可以在不阻塞的情况下读取,但这仅适用于一种方式 - 如果available()返回非零,您知道您可以在不阻塞的情况下读取,但如果它返回零,您不一定会被阻塞。输入流总是available().

您可能希望研究非阻塞 I/O API,java.nio而不是使用流。

于 2013-06-19T12:21:31.380 回答
0

您可以在单独的线程中处理每个设备。这样,即使设备没有响应,您的程序也会保持响应。但要注意多线程编程的陷阱。

有关 Java 多线程编程的更多信息,请访问http://docs.oracle.com/javase/tutorial/essential/concurrency/

于 2013-06-19T12:21:34.253 回答