首页 > 解决方案 > Java - 用于设备控制的非阻塞 SocketChannel,通用方法

问题描述

我正在寻找一种通过 TCP/IP 接口控制外部设备的好方法。该设备由命令字符串控制,并用字符串回答。除了回答直接命令外,它还不断地将数据作为字符串输出。我想在一个线程中拥有这个设备控制,用于将命令写入套接字并从套接字读取数据。

有时,设备不会输出数据。因此,我的设备套接字上的阻塞 read() 会阻塞上述线程。在这种情况下,我将无法向设备发送命令,因为线程在 read() 中被阻塞。

我开始使用 SocketChannel,因为我可以将这种类型的通信设置为非阻塞模式。现在,这工作正常,除了在我使用 read() 轮询数据的循环中,系统负载急剧增加,因为轮询循环显然对系统施加了压力。我发现在每次 read() 操作之后让线程休眠以保持系统负载低并不是很优雅。

我还发现我可以在普通的 Socket 对象上为 read() 设置一个SO_TIMEOUT值。但是通过使用它,我将不得不将抛出的超时异常用作正常的程序流,在我看来这不是很优雅,也不是......特别是因为在这个应用程序中能够听取来自设备并同时发送命令。

完成这项任务的最佳方法是什么?还有一个我还没有想到的机会吗?

谢谢, 迈克

标签: javasocketsniononblocking

解决方案


推荐阅读