Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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_Networking_Tcp_Protocols_Apache Mina - Fatal编程技术网

Java TCP中的无序数据

Java TCP中的无序数据,java,networking,tcp,protocols,apache-mina,Java,Networking,Tcp,Protocols,Apache Mina,我有一个应用程序,它使用ApacheMina库进行基于TCP的通信。ApacheMina库提供了一个带有IOBuffer的回调,该回调包含通过网络传输的数据,但数据经常被无序或冗余地接收。我浏览了TCP协议,它说该协议总是确保以正确的顺序传递数据。为其服务器提供API的公司声称,他们正在使用TCP/IP发送回响应,但是在发送回响应之前,他们的服务器并不关心确认客户端(在本例中为我的应用程序/apache mina库)是否连接到服务器。因此,服务器只是发出消息并继续 如果我没有弄错的话,这就是UD

我有一个应用程序,它使用ApacheMina库进行基于TCP的通信。ApacheMina库提供了一个带有IOBuffer的回调,该回调包含通过网络传输的数据,但数据经常被无序或冗余地接收。我浏览了TCP协议,它说该协议总是确保以正确的顺序传递数据。为其服务器提供API的公司声称,他们正在使用TCP/IP发送回响应,但是在发送回响应之前,他们的服务器并不关心确认客户端(在本例中为我的应用程序/apache mina库)是否连接到服务器。因此,服务器只是发出消息并继续

如果我没有弄错的话,这就是UDP协议的行为。我的问题是,如果服务器使用TCP将响应发送回:

  • 为什么我会得到无序的数据(这很少见,但偶尔会发生)
  • 使用TCP协议的机器如何在发送数据之前不确保接收器设备已连接到该机器而直接触发并忘记数据
  • 这真的是TCP或UDP还是TCP协议的一些变体

  • ApacheMina通过各种传输(包括TCP)进行异步消息传递

    因为Mina是异步的,所以应该期望无序交付

    为什么我会得到无序的数据(这很少见,但偶尔会发生)

    一种可能的解释是正在使用多个TCP流。使用一个TCP流交付的数据将按顺序交付,但如果使用多个流,则一个流中的数据可能会“超过”另一个流、发送端或接收端的TCP堆栈、网络或客户端库中的数据

    使用TCP协议的机器如何在发送数据之前不确保接收器设备已连接到该机器而直接触发并忘记数据

    因为。。。可靠的交付不是Mina的基本属性

    如果您正在使用Mina与具有特定应用程序协议的服务进行对话,则该协议将确定“在检查接收器是否连接之前发送数据”是否允许/是否有效。例如,它不会对HTTP响应执行任何操作,因为HTTP响应是在先前为发送请求而建立的连接上发送的

    实际上,使用Mina的方法似乎有很多种。有些涉及应用程序协议;e、 g.参见
    HttpClientCodec
    HttpServerCodec
    。其他人则不然

    这真的是TCP或UDP还是TCP协议的一些变体

    如果他们说TCP被用作传输,那么它就是。但是,Mina既不是TCP也不是UDP。是米娜。它隐藏传输的详细信息



    总之,如果您想要TCP/IP的可靠性/顺序交付属性,您可能应该直接使用它们。Mina通过放松(单个)基于流的传输的正常属性,提供了比通过同步套接字的传统TCP/IP更高的性能。

    服务器未使用Mina。他们声称正在使用TCP套接字。我的java应用程序是一个客户端,使用ApacheMinathanks进行详细解释。如果我错了,请纠正我。我一直认为HTTP服务器和/或TCP套接字总是在发送响应之前检查客户端是否连接到它们。例如,在TCP的情况下,服务器上的TCP套接字应该从客户端接收到它已接收数据的ack,否则服务器将发送回它,直到客户端发送它已接收数据的ack为止。类似地,服务器上的http将等待一段时间,直到客户端连接,直到http客户端接收到它。不是这样吗?是的。这是正确的。您实际使用的是什么协议?我使用的服务器API的公司声称他们使用TCP协议将响应发送回客户端,但他们还说,为了发送回响应,服务器只是触发并忘记这意味着如果在服务器发送响应时客户端未连接,服务器将永远不会重试将其发送回。这就是为什么我感到困惑的原因,如果真正的TCP就是这样工作的,或者如果服务器可能正在使用TCP的变体,TCP可以这样使用。这取决于应用程序协议。什么是应用程序协议?