java - 在 Java MMO 中向客户端获取数据

标签 java sockets

我正在尝试用 Java 制作在线 MMO。这将是一个简单的游戏,您可以在其中获得一个角色并可以四处移动并射击其他玩家,所有这些都是自上而下的 2D 游戏。服务器将是多线程的并且使用 Java,客户端也将使用 Java。客户端会将所有用户输入发送到服务器,服务器将处理所有逻辑(玩家、敌人等的移动)并将位置发送回客户端。无论如何,将有关所有敌人和玩家位置的所有信息提供给客户端的最佳方法是什么?最好的方法是将所有数据放在一个对象中并对其进行序列化并将其写入套接字,然后在客户端反序列化吗?

最佳答案

通常您通过两种方式发送更新:

  1. 您会根据需要定期广播快速变化但不太重要的状态,例如实体位置(例如,每秒几次)
  2. 您在重要事件发生时发出通知。

在服务器上序列化数据并将其发送到客户端是可以的,但只发送您需要的数据并且不要使用不必要的更大的数据类型。将来您可能需要考虑第三方序列化库,它们可能性能更高或具有更紧凑的表示形式,但您现在离那一点还有一段距离。您还必须考虑当您发送的对象以某种方式更改格式时该怎么做;这会破坏老客户吗?

服务器的主要工作之一是确保您只将消息发送给真正需要它们的人;这通常至少通过距离检查来完成。您还可以检查是否有东西需要发送;如果实体自上次以来没有移动过,则无需再次广播其位置。

客户端到服务器是另一回事:如果您盲目地反序列化您发送的对象,那么黑客可能会给您带来痛苦。从一开始就做好安全计划。让客户向您发送易于检查和验证的简单数据,并丢弃任何您收到的可疑信息。

关于java - 在 Java MMO 中向客户端获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2309594/

相关文章:

Java 如何获取声明对象的参数?

java - 使用 Hibernate 将两个或多个应用程序连接到同一个数据库

java - 将文本字段值发送到不带表单标记的服务器

linux - 如何检查tcp peer是否关闭

java - 如何使用 Guice 使 Multibinder 与 FactoryModuleBuilder 和泛型一起工作?

java - 比 WifiManager startScan() 更快的 WiFi 扫描替代方案?

c++ - 服务器 accept() 超时后客户端套接字 connect() 成功

android - 与目标 VM 断开连接,地址 : 'localhost:8613' , 传输 : 'socket' for Android Studios version 2. 2.2

c# - TCP 套接字/NetworkStream 意外失败

c - 您可以在一个套接字接收调用中获得两个数据包以进行多播吗?