许多小包装都可以。实际上,如果您担心TCP开销,只需插入一个bufferstream
可收集最多1500个字符(或任何TCP MTU,最好动态地请求它)的,然后在一个地方处理该问题。这样做可以为您另外创建的每个额外包节省约40个字节的开销。
也就是说,发送较少的数据还是更好的方法,在那里建立更大的对象会有所帮助。当然,发送"UID:10|1|2|3
比发送要小UID:10;x:1UID:10;y:2UID:10;z:3
。实际上,在这一点上,您也不应重新发明轮子,而应使用诸如protobuf之类的库,该库可以将此类数据减少到10个字节或更少的字符串。
您唯一不应忘记的是插入一个 Flush
在流中的相关位置命令,因为一旦停止向流中添加数据,它就可能无限等待发送任何内容。当您的客户端正在等待该数据时,这确实有问题,并且在客户端发送下一条命令之前,您的服务器不会发送任何新内容。
包裹丢失是您可能会在这里影响的一点点。您发送的每个字节都可能被破坏,TCP会自动请求重传。较小的软件包意味着每个软件包被破坏的机会较小,但是由于它们增加了开销,因此您发送的字节甚至更多,从而增加了丢失软件包的几率。当包丢失时,TCP将缓冲所有后续数据,直到丢失的包被重新发送并接收。这导致较大的延迟(ping)。尽管由于封装损耗而导致的带宽总损耗可以忽略不计,但对于游戏来说,较高的ping是不希望的。
Bottom line: Send as little data as possible, send large packages, and do not write your own low level methods to do so, but rely on well known libraries and methods like bufferstream
and protobuf to handle the heavy lifting.