我正在制作多人游戏,玩家的动作通过网络发送,他们的位置存储在服务器中。我被告知UDP是最好的,因为它不依赖于持续连接,如果客户端错过了一个数据包也没关系。客户端可以在任何路由器上,不一定在服务器的LAN中。
是否可以设置客户端可以连接的服务器,以便定期更新附近对象/玩家的位置?
我不想将数据包发送到每个客户端,我听说多播可以解决这个问题,但我看到的每个例子都只能通过本地网络发送数据包。我可以组播过去的路由器,如果是这样,我怎么能用Java做到这一点? (并向我解释,因为我不知道我在做什么,这主要是真的)
实施例
服务器的IP地址为71.10.200.133
客户A的IP地址为38.49.339.293
客户B的IP地址为37.28.487.388
...
客户Z的IP地址为43.38.382.949
客户端A向玩家发送有关玩家位置的更新
服务器将更新发送到B-Z,而不会将数据包迭代到每个客户端。我如何做到这一点(如果可能的话)?
答案 0 :(得分:1)
当且仅当路由器允许时,多播将遍历路由器。除非您控制着您和客户之间的所有路由器,否则您的问题的答案是“不”。
答案 1 :(得分:0)
多播数据包是广播,因此它们到达该子网上的每个节点。对于您在Web上发送多播数据包不是一种有效或智能的数据发送方式。
对于基于LAN的流量:
组播很好
但是,对于互联网流量,我建议制作一个:
UDPClient
或
的TcpClient
用于基于互联网的流量以及可能基于LAN的多播(稍微混合一下)。
对于互联网流量:请记住,客户端需要首先启动连接,因为大多数路由器(家庭)都有防火墙阻止所有新的外部到内部流量。因此,创建一个套接字来监听任何传入连接的指定端口/端口,并从那里开始使用哪种分组广播/发送方式
答案 2 :(得分:0)
如果您具备此功能,您还可以选择使用多播代理或第2层VPN。 L2TP,https://en.wikipedia.org/wiki/Layer_2_Tunneling_Protocol 第2层VPN将中继单播和多播数据包。 这基本上允许您像上面提到的EJP一样控制路由器。 这个问题也是3岁,所以你现在可能已经找到了办法。