我编写了一个应用程序,用于侦听来自机器人的状态消息。我有一个与机器人打开的Socket连接。机器人不断发送我读取(并解析)的状态消息,以找出机器人完成当前任务的时间。
/**
* Listens on the Socket for RobotStateMessage (RSM). A RSM has messagetype 16 at byte[4]. The constructor of the RobotStateMessage class
* throws an exception when the message is found to be corrupt. If that happens the method waits for the next uncorrupted message.
*
* @param command the robot state message is added to the command
* @throws IOException
* @throws GeneralURMessage_Parse_Exception
* @throws TimeExpired_Exception
*/
public void executeRobotStateCommand(RobotStateCommand command) throws IOException, RobotStateMessage.GeneralURMessage_Parse_Exception, TimeExpired_Exception {
byte[] data = new byte[3000];
boolean run = true;
RobotStateMessage message = null;
long momentToQuit = System.currentTimeMillis() + 5000;
while (run) {
if (System.currentTimeMillis() > momentToQuit) {
throw new TimeExpired_Exception(5000);
}
ur_in.read(data);
int type = data[4];
if (type == 16) {
run = false;
try {
// contructor of RobotStateMessage parses the data
message = new RobotStateMessage(data);
} catch (RobotStateMessage.CorruptRobotStateMessage_Exception e) {
// the message received form ur was corrupted , ignore and wait for next message
run = true;
}
}
}
command.robotStateMessage = message;
}
当我停止从BufferedInputStream ur_in 读取一段时间后,会出现问题。在消耗所有缓冲的旧数据之后,任何暂停时间超过一分钟,并且ur_in.read(data)
阻止。
在使用缓冲数据后,BufferedInputStream上似乎没有新数据。使用第二个工具收听机器人的数据,我可以清楚地看到状态信息仍在播放。
Socket仍然存在,但是Inputstream似乎已经死了#34;我在套接字上设置了一个超时,以便read()不会永远阻塞,但这并没有解决我的问题,我在BufferdInputStream上没有收到更多的数据。
唯一有帮助的是重新连接套接字,这对我的问题来说不是一个令人满意的解决方案。
如何解决此问题的任何帮助或建议表示赞赏。如果您需要更多信息,请询问。
答案 0 :(得分:0)
我假设你正在使用TCP。如果您没有从缓冲区中读取,则套接字会通知机器人停止传输,直到缓冲区有能力接收更多数据。机器人软件必须处理,不能写入任何数据,并可能断开客户端连接。您不应该使用套接字缓冲区来存储数据,而是尽可能快地将数据移动到其他缓冲区。设置一个更大的接收缓冲区可能会有所帮助,但不是一个好主意。