Java 如何有效地将UDP数据包绑定到实体
到目前为止,我的应用程序一直使用TCP连接,但过了一段时间,我决定继续并开始通过UDP数据包发送一些信息。我正在开发的应用程序是一个爱好者游戏项目,我现在通过UDP数据包而不是TCP数据包发送移动 我面临的问题是如何有效地将UDP数据包链接到一个实体,在本例中是一个用户 以下是我当前的设置:Java 如何有效地将UDP数据包绑定到实体,java,sockets,udp,Java,Sockets,Udp,到目前为止,我的应用程序一直使用TCP连接,但过了一段时间,我决定继续并开始通过UDP数据包发送一些信息。我正在开发的应用程序是一个爱好者游戏项目,我现在通过UDP数据包而不是TCP数据包发送移动 我面临的问题是如何有效地将UDP数据包链接到一个实体,在本例中是一个用户 以下是我当前的设置: Account类有一个UUID变量 当TCP客户端成功连接时,TCP服务器会告诉客户端它的UUID是什么 UUID然后作为UDP数据包的“头”发送 当服务器接收到UDP数据包时,服务器会在报头中找到与UU
- Account类有一个UUID变量
- 当TCP客户端成功连接时,TCP服务器会告诉客户端它的UUID是什么
- UUID然后作为UDP数据包的“头”发送
- 当服务器接收到UDP数据包时,服务器会在报头中找到与UUID相关的帐户,然后相应地处理逻辑
列表上帐户索引的字符串,但问题是安全性-这意味着任何人都可以发送带有某人帐户索引的UDP数据包(分别为1、2、3、4、5、6等)并使用此“欺骗”或假数据包对其帐户执行操作
UUID没有遇到这个问题,虽然同样的安全问题仍然存在,但很可能有人知道另一个用户UUID
将数据报数据包绑定到帐户的最佳方式是什么,而不涉及大的安全风险,也不破坏带宽。UUID可容纳16个字节(两个长
原语),因此,在方案中,我不认为您真的需要太关注它的大小。只是不要将其作为字符串传输。您可以使用数据包的源地址
如果使用DatagramChannel
接收数据报,则receive
返回源地址。如果使用DatagramSocket
接收数据包后,可以通过调用getSocketAddress
获取数据包的地址
这仍然不是完全安全的,因为如果有人知道别人的地址,他们可能会欺骗别人的地址,尽管它的开销为0。那么它到底是如何传输的呢?您说它是两个长原语,比如说,我在使用DataOutputStream,我将如何处理它。(我如何从UUID中获得第一个长和最后一个长,更重要的是,我如何使用这两个长来再次创建UUID)我宁愿使用一点开销,也不愿有这么容易搞乱的东西,找到某人的IP地址并不难。他们也需要端口号,但我同意你应该对重要的事情有更多的安全性。