我的服务器应该同时使用TCP和UDP吗?

use*_*804 11 java udp tcp client-server broadcast

我正在编写客户端/服务器应用程序,但实际上找不到符合我需要的指南.在我开始之前,我自己做这件事会让我遇到许多设计缺陷.例如,服务器应该每秒多次更新每个客户端的状态.我假设我不能单独更新每个客户端,但UDP广播应该解决这个问题.但是我仍然需要一个TCP通道来与每个客户端可靠地通信,例如:聊天消息,用户输入等.

研究这个主题似乎服务器可以同时使用这两种协议 - 但只能是可能的(不是敏感的).没有人建议采用这种方法,事实上我从这篇文章中得知,使用这两种方法相当糟糕.


现在我对如何处理服务器中的数据非常困惑.除非我完全误解了丢包的内容,否则我想保证导致'server-request-packets'的用户输入不会丢失.关于保证使用UDP传递的所有关于SO的答案都说使用TCP.更令人沮丧的是,我能想象的每个服务器/客户端程序至少需要保证传递的一些消息(例如'disconnect'消息?).

我应该使用UDP,TCP,还是我只是在想这个问题?

Ste*_*n C 15

让我们在桌子上得到一些事实:

  • UDP不可靠.永远.

  • 在某些情况下,UDP可能特别有损; 例如,如果存在网络拥塞,速率限制或流量分析,或者UDP消息大小是否大于MTU.

  • UDP广播仅适用于本地网段.互联网路由器通常不允许广播进一步传播.这确实限制了它的用处.

  • UDP多播可能是可能的,除了它也往往被阻止.

所以这可能会给你带来两个主要的可能性:

  • 从服务器到每个客户端的UDP点对点消息传递.
  • TCP从服务器到每个客户端.

另一种可能性是使用UDP或TCP的某种对等网状通信,但这变得非常复杂.除非你真的需要,否则不要去那里,而且真的知道你在做什么.

所以对你的问题.

我应该使用UDP,TCP,还是我只是在想这个问题?

我建议在服务器和每个客户端之间使用TCP,因为它最简单.为了进一步简化,每个客户端使用多个TCP连接,以避免在单个套接字中复用多个"对话"的复杂性.

网络性能不是最佳的,但它可能足够好你的应用程序.我怀疑这是您希望花费所有开发人员时间的应用程序的一部分.

当你到达工作应用程序(客户端和服务器端)并且有人使用它时,你可能会发现(或不是!)网络是一个主要的瓶颈和用户不满的原因.然后,您将了解如何优化应用程序2.0版中的通信.

当您实现版本2.0(或3.0 ...)以解决可伸缩性时,您将需要从依赖单个服务器的方式开始.简而言之,如果你有N个客户端,并且N不断增加,那么在某些时候单个服务器将无法应对.应用程序设计中的其他内容也可能存在问题.例如,在游戏应用程序中,您无法向所有其他玩家发送有关每个玩家的持续更新...其中玩家数量不断增长.但请注意,这些问题在很大程度上与您使用的网络协议无关.

  • 好吧,坦率地说,如果你准备花时间,那么......就这样做吧.尝试所有替代方案,并进行缩放实验,这将告诉您哪个是最好的.我们无法向您提供有关哪种替代方案最适合您的详细可靠建议,因为它取决于一大堆变量...... (2认同)

Ste*_*ich 6

..但UDP广播应该解决这个问题

广播仅在本地网络内工作,相关的多播需要基础设施的支持 - 这不是微不足道的.

除此之外:"..编写客户端/服务器应用程序......"没有一般规则.通信方法和协议在很大程度上取决于用例,范围从简单的UDP或TCP数据包到复杂的消息传递体系结构,具有可靠性和实时性保证等.

因此,您需要做的事情取决于您要实现的目标,而您没有详细说明.