【发布时间】:2012-01-23 10:24:02
【问题描述】:
当一台服务器向多个客户端广播时,哪种实现更快/更有效:MulticastSocket 还是 DatagramSocket?
也请讨论一下解释,谢谢!
传递的消息涉及字符串和浮点数。
【问题讨论】:
标签: java networking broadcasting
当一台服务器向多个客户端广播时,哪种实现更快/更有效:MulticastSocket 还是 DatagramSocket?
也请讨论一下解释,谢谢!
传递的消息涉及字符串和浮点数。
【问题讨论】:
标签: java networking broadcasting
如果您的客户端位于多个子网上,多播是最佳选择。如果您只向一个子网络发送数据,广播的效率会稍微高一些。但是通常使用多播,因为差异非常微弱。
数据包含什么并不重要。
您可能会发现,如果您需要可靠的传送,使用 TCP 更简单,在某些情况下甚至可以更快(因为路由器往往针对 TCP 进行了优化)如果传送不需要可靠,则使用多播。
【讨论】:
决定因素通常是客户端是否在同一个网络上,或者以其他方式启用多播/链接网络。一般来说,多播比任何形式的单播都要高效得多,但是,多播并不可靠,并且不能跨异构网络(如互联网)工作,运营商倾向于禁用多播流量。
如果数据需要可靠,那么您确实需要使用 TCP 单播,或者在多播中添加某种形式的 FEC 以赋予数据流可靠性,并且如果流量需要通过互联网,那么您必须使用单播 TCP 或 UDP。
短版:如果您的数据很小、需要可靠、穿越互联网或不经常发送,请使用单播。如果您的数据很大,交付给大量客户端,可以容忍一些损失,并且只遍历您控制的网络或启用多播的网络,请使用多播。组播实际上是一种单播小马(通过同构网络进行不可靠的数据广播),而单播几乎可以做任何事情,但开销更高。
注意: 超过一定数量的数据丢失的 TCP 也不再可靠,(导致断开连接)并且来自单播的添加流量可能会降低该限制,因为它会成倍增加数据流量. FEC 会为非常多的客户端增加相对固定的开销,但有一点 FEC 和单播都不再有帮助,您只需重新设计网络即可获得可行的解决方案。
【讨论】:
您的问题不清楚。如果您正在广播,则使用DatagramSocket 或MulticastSocket 没有任何区别。如果您询问多播是否比广播更有效,(a) 答案是“是”,并且 (b) 您必须使用MulticastSocket 接收多播;对于发送它们,同样,您可以使用DatagramSocket 或MulticastSocket,效率没有差别。
【讨论】:
多播比数据报套接字更有效,但是,它也使用 UDP,因此不能保证数据包将被所有接收者接收。除非您在网络中有一个托管交换机,它会优先处理您的数据包,否则您很可能会以任何随机顺序丢失数据包,而不管您的网络使用情况如何。
如果您的网络中需要侦听多播的设备数量有限,我建议对每个设备进行 TCP 单播,并使用某种网络服务发现来查找您的设备。
【讨论】: