最好是通过套接字发送1个大数据包而不是发送几个小数据包? JAVA

时间:2015-06-28 22:42:34

标签: java sockets server

我正在创建一个服务器/客户端程序,它通过套接字从客户端向服务器发送2个类和2个int,然后再从服务器返回到客户端(依此类推)。这需要相对较长的时间,而且这个过程是在游戏循环中,并且它使得事情变得缓慢。我的问题是:发送这些东西的速度更快?

  • 收拾所有这些内容(每次我需要),然后将该大数据包发送到服务器并再次返回(然后解压缩数据)。
  • 将这些东西一个接一个地送回去。这将节省收拾所有这些东西的时间(我猜)。
  • 或者这些方法之间没有任何区别?
你对他们有什么看法?在这种过程中加快速度的任何其他方式?

Edit1:我正在使用TCP。

3 个答案:

答案 0 :(得分:0)

我想说去一个数据包选项。放入缓冲区以发送多个项目的成本相对较低,而不是在网络堆栈中上下移动以将数据块放到线路上。将事物作为一个块进行将倾向于获得IP窗口并且这样调整到更大的块,因此它们将比不必通过网络路由多个分组更快地流动。

答案 1 :(得分:0)

请记住,当您使用TCP(http,https,ftp,rsync等使用的网络传输协议)时,应用程序发送的数据将被视为有序字节流而不是作为单独的消息 - 换句话说,数据被视为一串字节,而不是"块"或者"阻止"数据。

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

无论如何,这实际上取决于你的意思"更好"。您是否尝试优化响应性或可伸缩性?

答案 2 :(得分:-1)

您列出的选项之间的选择取决于您正在开发的应用程序的使用和类型(发短信,发送统计数据......)。一般来说,强烈建议在这种情况下使用同步线程,是的,在网络上发送少量数据无疑会增加传输速度但这将在服务器端“生成”更多编码,因为您需要序列化的方法(因为你正在使用类对象)并在操作之前重新排序数据。