Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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_Networking_Network Programming_Udp_Nat - Fatal编程技术网

Java 互联网上的UDP协议。它是如何工作的?

Java 互联网上的UDP协议。它是如何工作的?,java,networking,network-programming,udp,nat,Java,Networking,Network Programming,Udp,Nat,由于我正在编写一个网络聊天程序(java,但不应该对这个问题产生影响),并且想使用UDP,我遇到了它不能在internet上工作的问题。经过一点研究,我发现您必须为特定端口激活端口转发。现在我的问题是: UDP是否以不可配置的方式在Internet上工作 例如,如果我要编写一个完整的网络游戏,使用UDP有意义吗?或者我会要求玩家激活端口转发并打开端口等 那么什么时候使用UDP才有意义呢?为什么 事实上,我还没有完全理解UDP的意义 对于我的编程观点,我想有一个直观的方法来使用它。 与创建Data

由于我正在编写一个网络聊天程序(java,但不应该对这个问题产生影响),并且想使用UDP,我遇到了它不能在internet上工作的问题。经过一点研究,我发现您必须为特定端口激活端口转发。现在我的问题是:

UDP是否以不可配置的方式在Internet上工作

例如,如果我要编写一个完整的网络游戏,使用UDP有意义吗?或者我会要求玩家激活端口转发并打开端口等

那么什么时候使用UDP才有意义呢?为什么

事实上,我还没有完全理解UDP的意义

对于我的编程观点,我想有一个直观的方法来使用它。 与创建
DatagramSocket
DatagramPackage
一样,使用数据和目的地配置数据包,并通过internet发送出去


至于我的用户,我不希望他们必须配置任何特定的东西,比如打开他们想要使用的确切端口等。我只希望他们使用该程序(服务器和客户端),它应该可以工作。

编辑:使用Joachim Pileborg的正确建议

UDP通常是基于动作的游戏的更好选择,在基于动作的游戏中,使用有关玩家、玩家输入或游戏世界的最新数据更新客户端或服务器至关重要

TCP从三方握手开始建立连接(这需要时间)。如果您的游戏通信协议是通过TCP,则消息中的所有数据包必须在消息可用之前到达。即使是少量的网络拥塞也可能导致游戏延迟

TCP适用于必须完全到达的通信

使用UDP,客户端或服务器可以发送单个数据包中的最新玩家/游戏状态,这些数据包不依赖于是否按顺序到达。如果一个包裹迟到了,或者到达时出现了故障。。。应该忽略它

UDP对于需要快速的通信是好的,但是丢失单个数据包是可以的

两者都应该在Java平台中可用

下面是一些进一步的阅读:

您遇到的问题不是UDP与TCP之间的问题(尽管使用不可靠、无序的UDP作为聊天应用程序的基础对我来说似乎是一个奇怪的选择)

问题在于我们的经济。简言之,家庭路由器执行一种称为的网络功能。他们这样做是为了为NAT内的所有机器使用一个公共IP地址(这些机器被赋予私有地址——通常是10.0.0.0或192.168.0.0)。然后,路由器将LAN内部发送的所有数据包中的源IP地址从专用地址切换到公用地址。它使用端口号“记住”哪台机器将什么发送到了什么地址,以便在响应到达时执行向后转换

当有人想在NAT后面启动与机器的连接时,问题就出现了。如果没有首先看到传出连接,NAT就不知道应该将数据包转发到哪个内部计算机和端口。这就是发生在你身上的事


对于这个问题有多种修复方法,最简单的是手动端口转发(正如您所发现的),但这是任何对等应用程序都会面临的一个众所周知的问题。如果您需要联系NAT背后的机器(即联系大多数家庭用户),并且希望您的应用程序能够开箱即用(用户不必摆弄自己的路由器),那么您需要研究NAT遍历技术,在应用程序中实现它们,并希望用户的家庭路由器支持它们。这是一个巨大的颈部疼痛

昨天对这个项目更为具体。我没有得到一个答案,为什么这个问题现在已经深入人心了。当我想知道答案时,我又问了一个问题:大多数多人游戏的大部分通信都使用UDP。但是不经常聊天,然后他们使用TCP。不要问同样(或太相似)的问题两次,而是修改现有的问题。请耐心等待,您可能不会立即得到答案,但好的问题迟早会得到答案。那么他们如何处理用户打开端口和激活端口转发的要求呢?您可能想阅读并了解。TCP/IP是完整IP堆栈的通用名称,我想您指的是TCP。而且只有在建立连接时才是同步的,一旦建立了连接,协议就完全是异步的。因此,回到游戏示例,他们使用NAT遍历技术来保持用户的配置过程?对等应用程序(如bit torrent、skype等)所有这些都必须进行某种形式的NAT遍历。穿越NAT的一个示例技术是让用户保持到某个中央服务器的永久TCP连接(由用户发起)。然后,如果有人想向特定用户发送消息,消息将被发送到服务器,服务器将消息转发给相关用户。另一个例子是使用几种协议之一自动配置NAT。例如,IGD:其思想是在用户程序中使用IGD来配置用户的NAT。是的,只要侦听传入连接的机器在NAT后面,TCP的问题基本相同。在这里,请查看Vuze(bit torrent client)wiki上的NAT指南:下面是另一个可能有用的链接: