java - Java - 用于设备控制的非阻塞 SocketChannel,通用方法
问题描述
我正在寻找一种通过 TCP/IP 接口控制外部设备的好方法。该设备由命令字符串控制,并用字符串回答。除了回答直接命令外,它还不断地将数据作为字符串输出。我想在一个线程中拥有这个设备控制,用于将命令写入套接字并从套接字读取数据。
有时,设备不会输出数据。因此,我的设备套接字上的阻塞 read() 会阻塞上述线程。在这种情况下,我将无法向设备发送命令,因为线程在 read() 中被阻塞。
我开始使用 SocketChannel,因为我可以将这种类型的通信设置为非阻塞模式。现在,这工作正常,除了在我使用 read() 轮询数据的循环中,系统负载急剧增加,因为轮询循环显然对系统施加了压力。我发现在每次 read() 操作之后让线程休眠以保持系统负载低并不是很优雅。
我还发现我可以在普通的 Socket 对象上为 read() 设置一个SO_TIMEOUT值。但是通过使用它,我将不得不将抛出的超时异常用作正常的程序流,在我看来这不是很优雅,也不是......特别是因为在这个应用程序中能够听取来自设备并同时发送命令。
完成这项任务的最佳方法是什么?还有一个我还没有想到的机会吗?
谢谢, 迈克
解决方案
推荐阅读
- intellij-idea - 可以从当前程序中清除 intellij/pycharm 控制台
- python - 使用正则表达式和 lambda 根据另一列值拆分列数据框中的文本
- xcode - 为中学复制游戏场景?
- javascript - 使用 get() 然后 add() 的 Firestore 问题
- python - 在 Django 中制作自定义管理命令时,“_private.py”文件的目的是什么?
- xamarin.forms - Xamarin 形式的可绑定 EventHandler
- javascript - 如何立即触发 dragend 事件
- python-3.x - 如何使用 python 获取单个 MACRO-VBA 文件中存在的多个按钮的名称?
- python - 连续字符后的意外字符(我是初学者请帮助)
- python - Heroku CLI 登录失败并出现错误“错误:ENOENT:没有这样的文件或目录,打开 'H:/_netrc'”