Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java套接字:检查客户端是否能够从服务器接收消息_Java_Sockets - Fatal编程技术网

Java套接字:检查客户端是否能够从服务器接收消息

Java套接字:检查客户端是否能够从服务器接收消息,java,sockets,Java,Sockets,当Iflush()从服务器的OutputStream发送消息时,客户端要么接收到消息,要么没有接收到消息(如果在超时之前断开了连接)。我需要从服务器端以某种方式控制这种情况,我必须在发送消息之前知道客户端是否能够接收消息。如何做到这一点?我假设您使用的是TCP/IP连接: TCP是一种面向连接的协议:任何时候发送消息包时,接收方都必须响应确认(该协议位于应用层之下,因此如果没有抛出错误,则可以假定消息已收到)。 在发送消息之前,无法知道是否会收到消息,但您可以假设,如果连接处于活动状态,它将工作

当I
flush()
从服务器的
OutputStream
发送消息时,客户端要么接收到消息,要么没有接收到消息(如果在超时之前断开了连接)。我需要从服务器端以某种方式控制这种情况,我必须在发送消息之前知道客户端是否能够接收消息。如何做到这一点?

我假设您使用的是TCP/IP连接:

TCP是一种面向连接的协议:任何时候发送消息包时,接收方都必须响应确认(该协议位于应用层之下,因此如果没有抛出错误,则可以假定消息已收到)。
在发送消息之前,无法知道是否会收到消息,但您可以假设,如果连接处于活动状态,它将工作。

过去,我通常在单独的线程中使用阻塞读取来读取客户端消息,并根据需要传播它们

如果客户端断开连接,则操作返回-1,我们将其视为客户端已“断开连接”且InputStream应关闭的通知。如果连接异常终止,它还可能引发IOException


然后,您可以测试以验证是否仍然可以写入消息。

是的,这是TCP/IP连接。问题是没有抛出错误,看起来消息已经传递,但实际上没有。输入/输出流和套接字本身未关闭。当客户端在超时TCP“消息”未被确认之前与Internet断开连接时,会出现这种情况。单个数据包得到确认。@justasd但是如果客户端突然断开连接,服务器迟早会抛出超时(除非超时设置为无限时间)。是的,您是对的,但是消息可以在客户端断开连接之后和超时之前发送。如果以30秒的间隔发送,则不会收到消息。如果客户端和服务器都在同一个intranet中,则可以尝试设置较低的超时(不确定最小安全值是多少)如果您需要知道消息是否已完全通过TCP/IP传输,那么您需要从客户端发送某种ACK消息。例如,此ACK消息可能是消息发送的时间,对吗?如果客户端接收到消息,则向服务器发送同一时间的消息,这样服务器就知道消息已被接收。问题是我不能轻易修改客户端。谢谢,史蒂夫。还有一个问题:这个单独的线程是否应该使用与主线程相同的InputStream?您应该从另一个线程读取所有内容。如果不需要异步写入客户机,则可以在单个线程中管理所有逻辑。外部循环块在读取上,内部循环写入响应。