如果在 readShort() 期间发生超时异常,套接字接收到的数据会发生什么情况?

What happens to data received by a socket in case of timeout exception during readShort()?

我正在使用 TCP 套接字开发客户端 (Java)/服务器 (C++) 应用程序。 我使用的协议由消息组成,消息以 2 个字节开头,定义了消息内容的类型。 所以基本上,接收线程在循环中等待接收数据。但是我想对套接字使用超时来通知其他主机发送数据的时间太长。

receivingSocket.setSoTimeout(durationInMilliseconds);
DataInputStream in = new DataInputStream(receivingSocket.getInputStream());
boolean success = false;
short value = 0;
do {
    try {
        value = in.readShort();// will throw a SocketTimeoutException  in case of timeout, without 2 bytes available from the socket
        success = true;
    } catch (SocketTimeoutException e) {
        /// do something if it happens to often. Otherwise go on with the loop
    }
    } catch (IOException e) {
        /// abort connection in case of other problem 
    }
} while (!success)

现在,如果接收线程在套接字缓冲区中只有一个可用字节的位置调用 in.readShort() 会发生什么情况? 这个字节是否留在套接字的堆栈上?还是丢失了?在第一种情况下,我可以在下次调用 in.readShort() 时阅读它,否则它似乎永远丢失了......

readShort() 这是一个例子,我的问题也代表 readInt(),...

感谢您的帮助,

未指定。我相信实现的工作方式是丢失了一半数据,但无论如何都没有写任何其他内容,所以你只需要假设最坏的情况。

但是在实践中这不太可能发生,前提是您遵守发件人的常识。