如果在 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(),...
感谢您的帮助,
未指定。我相信实现的工作方式是丢失了一半数据,但无论如何都没有写任何其他内容,所以你只需要假设最坏的情况。
但是在实践中这不太可能发生,前提是您遵守发件人的常识。
我正在使用 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(),...
感谢您的帮助,
未指定。我相信实现的工作方式是丢失了一半数据,但无论如何都没有写任何其他内容,所以你只需要假设最坏的情况。
但是在实践中这不太可能发生,前提是您遵守发件人的常识。