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
Java中TCP通信中如何获取确认_Java_Sockets - Fatal编程技术网

Java中TCP通信中如何获取确认

Java中TCP通信中如何获取确认,java,sockets,Java,Sockets,我已经用Java编写了一个套接字程序。服务器和客户端都可以相互发送/接收数据。但我发现,如果客户机使用TCP向服务器发送数据,那么一旦服务器接收到数据,TCP就会在内部向客户机发送确认。我想检测或处理该确认。如何在TCP中读取或写入数据,以便处理TCP确认。谢谢。通过TCP套接字发送的任何数据都会在两个方向上得到确认。就TCP有线通信和应用程序信令而言,从客户端发送到服务器的数据与从服务器发送到客户端的数据相同。正如@Eric提到的,没有办法得到那个信号 这可能是因为您在等待服务器响应时正在谈论

我已经用Java编写了一个套接字程序。服务器和客户端都可以相互发送/接收数据。但我发现,如果客户机使用TCP向服务器发送数据,那么一旦服务器接收到数据,TCP就会在内部向客户机发送确认。我想检测或处理该确认。如何在TCP中读取或写入数据,以便处理TCP确认。谢谢。

通过TCP套接字发送的任何数据都会在两个方向上得到确认。就TCP有线通信和应用程序信令而言,从客户端发送到服务器的数据与从服务器发送到客户端的数据相同。正如@Eric提到的,没有办法得到那个信号

这可能是因为您在等待服务器响应时正在谈论超时。您希望检测响应是否花费太长时间。客户机的消息是否可能比服务器的响应大,因此缓冲会妨碍响应而不是初始请求?您是否尝试过使用非阻塞套接字


如果您还没有这样做,您可能需要查看。它有许多类,可以让您对套接字通信进行更细粒度的控制。

这根本不可能,即使您是直接针对本机OS sockets API使用C编程。SocketsAPI的一个要点是它为您抽象了这一点

TCP层的数据发送和接收不一定与发送或接收数据的Java调用相关。您在一个Java调用中发送的数据可能会被分成几个部分,这些部分可能会被缓冲、独立发送和接收,甚至会无序接收

有关此问题的更多讨论,请参阅

我想检测或处理该确认

没有API用于在协议栈之上的任何级别接收或检测ACK


重新考虑你的要求。知道数据已经到达服务器对应用程序没有任何用处。您想知道的是对等应用程序已经收到了它,在这种情况下,您必须让对等应用程序在应用程序协议级别进行确认。

这在纯Java中是不可能的,因为Java的网络API都处理套接字,而套接字隐藏了所有TCP细节

您需要一个能够处理IP层数据的协议,以便可以获取TCP头。DLPI是最流行的API


不幸的是,这种网络没有Java实现。您必须通过JNI使用本机代码来执行此操作。

不正确,请参阅我的答案,NIO在这件事上一点帮助都没有。对不起,它怎么不正确?从客户端发送到服务器的字节与从服务器发送到客户端的字节有什么区别?我怀疑这个问题混淆了TCP套接字与(正如您所提到的)缓冲和其他问题,这就是我提到非阻塞和NIO的原因。这是不正确的,因为它没有回答这个问题。他想“检测或处理这种确认”,但在这个答案中没有任何内容可以说明这一点。哇。一根2年的线。很明显,您有@EJP.:-)的备份我同意答案是不恰当的。我会调整它。“TCP/IP实践‘选择性确认’。并不是每个字节/数据包/段都被确认。”正如我所读到的,这是不正确的。SACK是通知发送方在丢失的数据包之前已经收到了数据包,因此只需要重新传输丢失的数据包。如果数据包到达接收器,它将被确认——在特定的ack中或作为累积ack的一部分。同意,修改。我的回答的其余部分仍然适用。你在回复中没有@Gray me,所以我没有回来看到你显著地编辑了你的帖子以删除错误信息。否决票被删除。我想你的1740张反对票都是对EJP的评论?:-)@格雷:如果你是说我对其他问题或答案投了反对票,是的,除非我对现有的评论投了赞成票,或者可能投了反对票。谢谢您的信息。请考虑删除对TCP的引用,只讨论应用程序级别的行为。客户端向接收请求的服务器发送请求。服务器将来自应用程序的消息作为响应发送回客户端,但客户端从未收到响应。这就是你想说的吗?