- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究多人游戏中服务器-客户端通信的结构。
我得出的结论是,UDP 是最佳选择,因为它采用“一劳永逸”的使用方式,即使数据包丢失也不会阻止应用程序。我还将使用 TCP 发送需要可靠性的数据包,例如在登录过程和服务器更改、 map 更改、更新等信息交换期间。它还将运行基于 IRC 的聊天。 (所有命令实际上都是 IRC 风格的自定义消息)。
我想知道在服务器和客户端之间发送交互消息(移动、咒语、对象、 Action 等)的最佳方式是什么。
通过阅读一些文档,我来到了 MulticastSocket。
我的问题是:
最好向所有客户端发送连续的信息流,为每个播放器启动一个线程(就像我在 TCP 通信中所做的那样),其中每个 DatagramSockets 将监听一个队列,将每条新消息发送到其客户端。这意味着所有 map 和所有 Action (假设整个 map 上可以有 50 个玩家)将被发送给所有玩家,并且每个数据包必须更大以包含所有这些信息。或者最好为每个 map 使用一个线程,仅当某些玩家在该特定 map 内时才激活,使用多播通信,仅向该 map 内的玩家发送消息,并使用 MulticastSocket 进行监听。
我阅读了有关使用多播的防火墙或路由器的问题,但我无法弄清楚这些问题可能是什么(与普通 UDP 不同)。
任何配置问题很少的人都应该使用该应用程序。
最佳答案
查看上面的场景,您需要确定您的应用程序是否绝对需要 TCP 连接,因为 TCP 连接需要每个 TCP 连接一个线程,没有异常(exception)(除非使用 nio)。
现在要定位程序的 UDP 部分,您有两个基本选择:
a) 你生成一个线程来接收所有玩家的数据报包。
在这种情况下,所有玩家都将他们的数据报包发送到一个接收器,然后接收器决定如何处理数据。该数据可能会被发送到各种队列以供其他线程处理。可以使用单线程或多线程(每个玩家)将数据发送回所有玩家。
优点:
缺点:
b) 您为每个玩家生成一个线程,并在每个玩家的不同端口上监听。
在这种情况下,所有玩家都有自己的处理线程,可以直接处理数据或将其发送到中央处理队列。通过这样做,可以并行处理数据,从而以更高的资源使用率实现更快的处理速度。同步也需要特别注意,可能需要使用原子和可重入读/写锁。写回套接字通常应该发生在另一个“每个玩家线程”上。
优点:
缺点:
在任何一种情况下,通过使用 TCP,您将需要每个玩家至少一个线程。问题是您是否愿意使用更多的资源来获得服务器更流畅、更快速的响应。
关于java - 用于多人游戏的 MulticastSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18430231/
我的服务器当前能够发送和接收多播数据包。我还添加了接收和发送单播数据包的功能。因此,我创建了“DatagramSocket uniRecv”和“DatagramSocket uniSend”来模仿多播
我正在使用多播编写一个java聊天应用程序。客户端可以在它们之间进行通信,但它们也可以向服务器发送预定义的消息,服务器始终对相应的预定义消息有相同的答案。 客户端和服务器端都可以接收和发送消息。它们都
我正在尝试让多播套接字在“服务器”应用程序上工作,该应用程序将向一堆 Android 手机发送信息。负责设置套接字并发送一些数据的代码片段如下: private MulticastSocket
我正在编写一个通过 MulticastSocket 进行通信的 Android 应用程序。它基本上工作正常,但我遇到了一个奇怪的错误:每当连接中断并恢复时(例如设备短暂失去 WiFi 连接),应用程序
这个问题已经有答案了: 奥 git _a (1 个回答) 已关闭 9 年前。 我编写了一些应该从 MulticastSocket 接收数据的代码。由于某种原因,套接字永远不会接收。我已将其分解为下面的
我正在尝试在我的 PC(Ubuntu,客户端)和手机(Android,服务器)之间创建简单的多播通信。 单播/TCP 连接工作没有任何问题,定义的端口 (37659) 在 PC 和手机上均打开。尝试使
我正在研究多人游戏中服务器-客户端通信的结构。 我得出的结论是,UDP 是最佳选择,因为它采用“一劳永逸”的使用方式,即使数据包丢失也不会阻止应用程序。我还将使用 TCP 发送需要可靠性的数据包,例如
我正在尝试订阅一个特定的市场数据提要,通过 FAST 协议(protocol)以多播方式分发。在Java中,有MulticastSocket,也有DatagramChannel支持多播。 我使用的
尝试调用 MulticastSocket 上的 joinGroup(addr) 时出现 SocketException。这只发生在我们设置为在机器启动时自动启动我们的应用程序的 Windows 机器上
我在 Android 中有一个应用程序使用 MulticastSocket 进行通信。我想在 J2ME 中编写类似的应用程序,使用 MulticastSocket 通过 WiFi 与 Android
我正在尝试在 Java 上执行一个简单的多播套接字示例。 MulticastSocket s = new MulticastSocket(6789); InetAddress group = In
我有 2 个线程想要调用: multicastSocket.send(dP1) 和 multicastSocket.send(dP2) 分别,其中dP1和dP2是不同的DatagramPacket对象
我有两个线程。第一个在循环中发送带有 MulticastSocket 的数据报;第二个线程在循环中使用相同的 MulticastSocket 实例接收数据报。 它似乎工作正常,但我仍然有疑问。 这两个
我开发客户端-服务器应用程序,实时工作。服务器和客户端通过小消息交换,所以我选择 UDP 作为我的体系结构(正如网络中许多文章所建议的那样)。使用默认 java 的 DatagramSocket/Da
我有一些线程在同一个 MulticastSocket 上写入(取决于调度,可能会发生多于一个线程同时在 MulticastSocket 上写入)。我是否必须通过使用某种形式的锁定让他们在每个计时器上写
我正在尝试在创建 MulticastSocket 后加入多播组。 做类似的事情: MulticastSocket mySocket = new MulticastSocket(4444); mySoc
当一个服务器向多个客户端广播时,哪个实现更快/更有效:MulticastSocket 或 DatagramSocket? 也请大家讨论一下,谢谢! 传递的消息涉及字符串和 float 。 最佳答案 决
我正在推理我的应用程序中的多播套接字线程安全性。首先,我有多个线程共享同一个多播套接字实例,该多播套接字用于加入同一端口上的不同组。这是我的问题: 我是否必须同步对 joinGroup() 和 lea
我可能对此处的绑定(bind)一词有根本的误解,但我对 MulticastSocket 的用法感到困惑。它是构造函数。他们不会做我理解他们应该做的事情,因此任何能帮助我消除误解的人都将不胜感激。 首先
我开始使用 MulticastSocket 编写代码,尝试制作一个简单的应用程序,使用客户端和服务器来发送消息。 我为服务器准备的代码: import java.io.IOException;
我是一名优秀的程序员,十分优秀!