java - readShort()期间如果出现超时异常,socket接收到的数据会发生什么情况?

标签 java sockets timeout datainputstream

我正在使用 TCP 套接字开发客户端 (Java)/服务器 (C++) 应用程序。 我使用的协议(protocol)由以 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(),...

感谢您的帮助,

最佳答案

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

但实际上,只要您遵守发件人的常识,这种情况就不太可能发生。

关于java - readShort()期间如果出现超时异常,socket接收到的数据会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30457609/

相关文章:

java - 哈希位图的廉价/快速方法?

java - Selenium 脚本测试运行的 RateLimit 问题

c - 在 C 中使用数据包模式时如何绑定(bind)到默认接口(interface)?

java - 如何使用 Java comm API 处理读取超时

javascript - setTimeout -- 立即执行回调?

java - 超出 GC 开销限制

c# - 如何在同一个套接字上发送消息和接收响应

javascript - 尝试使用 socket.io 时出错

ant - 如果在给定时间内未输入,如何使 Ant 提示使用默认值?

Java线程安全类,参数每小时刷新一次