当前位置: 首页 > 知识库问答 >
问题:

从Java游戏服务器到客户端的TCP和UDP连接

锺离昂然
2023-03-14

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

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

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

我的问题是,我对使用UDP不太了解,在Java,从我的理解来看,它完全不同于仅仅为TCP拥有一个开放的Socket对象。我认为客户端和服务器之间的初始连接将由TCP完成,那么一旦建立了这种连接,服务器是否应该向客户端发送端口号,客户端将使用该端口号通过UDP与服务器通信?

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

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

再说一次,这些只是我的第一个想法,我对UDP不太了解,如果我完全弄错了,那么很抱歉!如果有人能帮上忙,谢谢!

共有1个答案

贾越
2023-03-14

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

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

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

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

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

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

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

 类似资料:
  • 我想做的是: 为了学习游戏编程,我使用专用服务器和UDP创建了一个回声设置。专用服务器在不同的城市(也就是不在我的本地网络中)。 在我的本地计算机上,我有一个udp客户端和服务器(两个不同的程序)。当我第一次启动python服务器时,windows防火墙立即询问我是否要添加异常。在允许我的python服务器联网之后,我仍然没有收到任何消息。(客户- 我的问题是: 游戏如何解决这个问题?我没有为我想

  • 创建 TCP 客户端 最简单的方法来创建一个 TCP 客户端,使用默认选项如下所示: NetClient client = vertx.createNetClient(); 配置 TCP 客户端 如果你不想使用默认值,则创建TCP 客户端时,通过传入NetClientOptions实例可以配置: NetClientOptions options = new NetClientOptions().s

  • 创建 TCP 服务器 使用最简单的方法来创建一个 TCP 服务器,使用所有默认选项如下所示: NetServer server = vertx.createNetServer(); 配置 TCP 服务器 如果你不想默认值,可以将服务器配置通过传入一个NetServerOptions实例来创建它: NetServerOptions options = new NetServerOptions().s

  • 在开发我的在线游戏时,我试图了解更多关于安全的知识。 截获从服务器发送的数据包、使用某些软件修改数据包并将数据发送回服务器是否可能,以及有多困难? 下面是一个场景: 玩家与AI敌人进行战斗。一个玩家输掉了这场战斗,在战斗结束时,数据包被发送回服务器,记录发生的事情。是否可以在发送之前修改此数据包,并告诉服务器玩家已经赢得了这场战斗?如何读取并修改这些数据? 是否有可能说玩家与1个敌人进行了一场战斗

  • 在探索和实现Proact设计模式后,遇到了一个问题,即客户端(“C”客户端)连接在限制后不再接受。开始探索netty。这是我试图做的1。C客户端建立连接2。Java服务器接受连接并开始使用TCP向客户端发送8 Mb大小的字节缓冲区。有什么想法吗?netty是一个好的选择吗?我浏览了netty的一个很好的例子,不幸的是不走运。 先谢谢你。 尊敬的Ravi