Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何有效地将UDP数据包绑定到实体_Java_Sockets_Udp - Fatal编程技术网

Java 如何有效地将UDP数据包绑定到实体

Java 如何有效地将UDP数据包绑定到实体,java,sockets,udp,Java,Sockets,Udp,到目前为止,我的应用程序一直使用TCP连接,但过了一段时间,我决定继续并开始通过UDP数据包发送一些信息。我正在开发的应用程序是一个爱好者游戏项目,我现在通过UDP数据包而不是TCP数据包发送移动 我面临的问题是如何有效地将UDP数据包链接到一个实体,在本例中是一个用户 以下是我当前的设置: Account类有一个UUID变量 当TCP客户端成功连接时,TCP服务器会告诉客户端它的UUID是什么 UUID然后作为UDP数据包的“头”发送 当服务器接收到UDP数据包时,服务器会在报头中找到与UU

到目前为止,我的应用程序一直使用TCP连接,但过了一段时间,我决定继续并开始通过UDP数据包发送一些信息。我正在开发的应用程序是一个爱好者游戏项目,我现在通过UDP数据包而不是TCP数据包发送移动

我面临的问题是如何有效地将UDP数据包链接到一个实体,在本例中是一个用户

以下是我当前的设置:

  • Account类有一个UUID变量
  • 当TCP客户端成功连接时,TCP服务器会告诉客户端它的UUID是什么
  • UUID然后作为UDP数据包的“头”发送
  • 当服务器接收到UDP数据包时,服务器会在报头中找到与UUID相关的帐户,然后相应地处理逻辑
问题是,UUID是一个相当大的字符串,这对带宽不是很友好,我可以很容易地使用整数,而不是引用
列表上帐户索引的字符串,但问题是安全性-这意味着任何人都可以发送带有某人帐户索引的UDP数据包(分别为1、2、3、4、5、6等)并使用此“欺骗”或假数据包对其帐户执行操作

UUID没有遇到这个问题,虽然同样的安全问题仍然存在,但很可能有人知道另一个用户UUID


将数据报数据包绑定到帐户的最佳方式是什么,而不涉及大的安全风险,也不破坏带宽。

UUID可容纳16个字节(两个
原语),因此,在方案中,我不认为您真的需要太关注它的大小。只是不要将其作为字符串传输。

您可以使用数据包的源地址

如果使用
DatagramChannel
接收数据报,则
receive
返回源地址。如果使用
DatagramSocket
接收数据包后,可以通过调用
getSocketAddress
获取数据包的地址


这仍然不是完全安全的,因为如果有人知道别人的地址,他们可能会欺骗别人的地址,尽管它的开销为0。

那么它到底是如何传输的呢?您说它是两个长原语,比如说,我在使用DataOutputStream,我将如何处理它。(我如何从UUID中获得第一个长和最后一个长,更重要的是,我如何使用这两个长来再次创建UUID)我宁愿使用一点开销,也不愿有这么容易搞乱的东西,找到某人的IP地址并不难。他们也需要端口号,但我同意你应该对重要的事情有更多的安全性。