通过套接字发送一个大数据包比发送几个小数据包好吗?JAVA

通过套接字发送一个大数据包比发送几个小数据包好吗?JAVA,java,sockets,server,Java,Sockets,Server,我正在制作一个服务器/客户机程序,通过套接字将2个类和2个整数从客户机发送到服务器,然后再从服务器发送回客户机(依此类推)。这需要相对较长的时间,而且这个过程是在游戏循环中进行的,这会使事情变得缓慢。我的问题是:发送这些东西的最快方式是什么 打包所有这些东西(每次我需要的时候),然后将那个大数据包发送到服务器,然后再发送回来(然后解压缩数据) 把这些东西一件一件地寄回去。这将节省打包所有这些东西所需的时间(我想) 或者这两种方法之间根本没有区别 你们怎么看?在这种过程中,有没有其他加快速度的

我正在制作一个服务器/客户机程序,通过套接字将2个类和2个整数从客户机发送到服务器,然后再从服务器发送回客户机(依此类推)。这需要相对较长的时间,而且这个过程是在游戏循环中进行的,这会使事情变得缓慢。我的问题是:发送这些东西的最快方式是什么

  • 打包所有这些东西(每次我需要的时候),然后将那个大数据包发送到服务器,然后再发送回来(然后解压缩数据)
  • 把这些东西一件一件地寄回去。这将节省打包所有这些东西所需的时间(我想)
  • 或者这两种方法之间根本没有区别
你们怎么看?在这种过程中,有没有其他加快速度的方法


Edit1:我正在使用TCP。

您列出的选项取决于您正在开发的应用程序的用途和类型(文本、发送统计数据…)。通常,强烈建议在这种情况下使用同步线程,并且在网络上发送少量数据无疑会提高传输速度,但这将在服务器端“生成”更多的编码,因为您需要序列化的方法(因为您使用的是类对象)并在操作数据之前对其进行重新排序。

我会说选择一个数据包选项。将多个项目放入缓冲区的成本相对较低,而将数据块传输到线路上则需要在网络堆栈上下移动。使事情按块进行将倾向于获得IP窗口,并将此类窗口调整到较大的块,因此它们将倾向于比必须通过网络路由多个数据包更快地流动

请记住,当您使用TCP(http、https、ftp、rsync等使用的网络传输协议)时,应用程序发送的数据被视为有序字节流,而不是单个消息——换句话说,数据被视为字节序列,而不是数据的“块”或“块”

根据TCP堆栈实现及其配置(例如Linux发行版上的TCP_NODELAY或TCP_CORK),内核接收的小数据段可能会被缓冲,直到可以发送一个MSS的数据(通常为1460字节),或者可能会立即发送数据,不管应用程序如何努力控制网络数据包大小


无论如何,这取决于你所说的“更好”是什么意思。您是否在尝试优化响应性或可伸缩性?

您的问题是关于数据包,而不是数据包。不要误用标准术语。TCP或UDP?这一点非常重要,因为它们的工作方式都不同。检查答案可以很好地解释这一点。[如果我没有正确地解决您的问题]:Thread=process,如果您使用的是一个线程(换句话说:如果您没有使用线程-->只有一个线程“main Thread”用于完成所有工作)。在客户端或服务器端使用多个线程可能有助于“分发任务”,最终提高传输和执行的速度。互联网上有很多线程同步教程,这里有一个完整的例子,这里写的关于线程的所有内容都与所问的问题无关,其余的基本上都是错误的。在TCP中发送较少的较大传输总是更好的。