【问题标题】:TCP and UDP connection to client from Java game server从 Java 游戏服务器到客户端的 TCP 和 UDP 连接
【发布时间】:2017-06-20 23:37:12
【问题描述】:

我正在为一个大学项目创建一个游戏服务器,所以我没有使用任何库/框架。

经过大量研究,我希望客户端和服务器使用 UDP 协议进行大量通信,例如角色移动和计时器,因为游戏这方面的可靠性并不那么重要,并且可以补偿丢失的数据包.

但我也想将 TCP 协议用于游戏的其他一些方面,例如对信息到达客户端至关重要的动作和事件。

我的问题是我对在一般情况下和 Java 中使用 UDP 知之甚少,据我了解,这与只为 TCP 拥有一个开放的 Socket 对象完全不同。我认为客户端和服务器之间的初始连接将由 TCP 完成,然后一旦建立此连接,服务器是否应该将端口号发送回客户端,客户端将使用该端口号通过 UDP 与服务器通信?

这让我想到了拥有多个客户端的问题,它们是否都需要分配不同的端口号才能通过 UDP 连接到服务器?那么服务器将为每个连接的客户端提供 1 个不同的端口号?

我的服务器计划是让每个客户端连接 1 个发送线程和 1 个接收线程 - 我是否能够在每个线程中处理 TCP 和 UDP 通信,或者每个客户端需要 4 个线程2 用于 tcp,2 用于 udp?

再一次,这些只是我最初的想法,我对 UDP 了解不多,如果我完全搞错了,很抱歉!谢谢,如果有人可以帮助解决这个问题!

【问题讨论】:

  • 从阅读 the Java UDP tutorial 开始通常情况下,您的 UDP 客户端应该使用相同的端口。
  • 如果你研究 UDP 和 Java,听起来很多问题都可以解决。
  • 我读过这篇文章,但我不明白 UDP 的无连接性质——如果服务器从多个不同的客户端接收到所有到这个 UDP 端口的移动数据包,它如何区分哪个字符发送哪个如果没有“连接”?
  • UDP 只负责传输,但您也可以将一些元数据放入有效负载或标头中。通常使用更高层的协议(例如 RTP 和 RTCP)来解决这个问题。

标签: java sockets tcp udp


【解决方案1】:

服务器是否应该向客户端发送一个端口号,客户端将使用该端口号通过 UDP 与服务器通信?

您可以这样做,也可以从属性文件中加载它。取决于你的实现。

[多个客户端]是否都需要分配不同的端口号才能通过 UDP 连接到服务器?那么服务器将为每个连接的客户端提供 1 个不同的端口号?

没有。服务器可以根据接收到的数据报 (UDP) 数据包上的 IP 地址来区分数据包属于哪个客户端。

我能否在每个线程中同时处理 TCP 和 UDP 通信,或者每个客户端需要 4 个线程,其中 2 个用于 tcp,2 个用于 udp?

您不需要单独的线程来发送数据,因为这不会导致线程阻塞。只有接收会导致线程阻塞,因此您的客户端程序只需要 2 个通信线程;一个接收 TCP,另一个接收 UDP 通信。

注意:Java 确实以完全不同的方式处理 TCP 和 UDP 通信。 TCP 是您写入的流(它会自动为您处理握手和数据包丢失),而 UDP 使用填充字节并发送的 DatagramPacket 对象。

【讨论】:

  • 感谢您的回复!鉴于每个客户端都将发送到服务器上的同一个端口,这是否意味着服务器只需要 1 个 UDP 接收线程来处理任意数量的客户端?
  • 不客气。是的,服务器应该只需要 1 个 UDP 端口来接收来自所有客户端的信息。在以这种方式接收消息之前,我已经编写了一个服务器。
猜你喜欢
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2012-10-13
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
相关资源
最近更新 更多