Java BufferedInputStream read()在没有从Stream中读取一段时间后才收到数据

时间:2018-01-02 14:17:18

标签: java sockets inputstream

我编写了一个应用程序,用于侦听来自机器人的状态消息。我有一个与机器人打开的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上没有收到更多的数据。

唯一有帮助的是重新连接套接字,这对我的问题来说不是一个令人满意的解决方案。

如何解决此问题的任何帮助或建议表示赞赏。如果您需要更多信息,请询问。

1 个答案:

答案 0 :(得分:0)

我假设你正在使用TCP。如果您没有从缓冲区中读取,则套接字会通知机器人停止传输,直到缓冲区有能力接收更多数据。机器人软件必须处理,不能写入任何数据,并可能断开客户端连接。您不应该使用套接字缓冲区来存储数据,而是尽可能快地将数据移动到其他缓冲区。设置一个更大的接收缓冲区可能会有所帮助,但不是一个好主意。