有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

互联网上的java UDP。它是如何工作的?

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

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

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

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

事实上,我并不完全理解UDP的意义

对于我的编程观点,我希望有一种直观的方式来使用它。 像创建DatagramSocketDatagramPacket一样,用数据和目的地配置数据包,并通过internet发送出去

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


共 (1) 个答案

  1. # 1 楼答案

    你遇到的问题不是UDP和TCP(尽管在我看来,使用不可靠、无序的UDP作为聊天应用程序的基础似乎是一个奇怪的选择)

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

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

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