让我们说,在一个程序中,有能力连接到套接字和服务器(这将是我自己的计算机 - localhost),并具有与服务器进行通信并返回的所有处理(接收和发送消息,如聊天服务)。如果我将此程序作为.jar文件发送给其他用户各自的机器,当用户执行程序时,它将连接到此套接字和服务器。如果所有设置都正确(从套接字输入流和输出流中正确写入和读取)并在GUI聊天框中显示消息,那么这两个用户是否能够与此聊天服务进行通信?
答案 0 :(得分:1)
是的,但阻止用户执行此操作的主要障碍是一个名为Network Address Translation(NAT)的东西。
简而言之,绝大多数连接到互联网的计算机没有自己独特的公共IPv4地址(绝大多数也没有IPv6地址,因为互联网服务提供商正在拖延推出IPv6,但是这完全是另一回事。
专用服务器通常具有(通常是多个)唯一的IPv4地址,但是大量的IP地址通常仅供运营自己Autonomous System的托管公司使用 - 即使这样,现在购买IP也非常价格昂贵,因为它们是一种有价值的稀有商品。
无论如何,在某种家庭互联网连接上的两个随机用户(如有线,DSL或光纤)几乎肯定有某种执行的路由器或调制解调器 NAT,为每个用户设备(计算机,平板电脑等)提供自己的专用LAN IP,而不是为每个设备提供唯一的公共IP。
这意味着NAT网关默认忽略来自公共Internet的入站连接。因此,如果您尝试向朋友的公共IP打开套接字,除非已正确配置该网关(调制解调器/路由器),否则它将默默地忽略您的连接尝试,并且您将超时或"连接被拒绝"输入消息。
有一些技巧可以解决这个问题,但是大多数技术要么需要更复杂的应用程序网络代码,要么需要用户在路由器配置页面中乱七八糟(临时用户通常不愿意做)。
如果您的客户使用NAT,您需要采用其中一种技术。如果您的某个客户端的静态IP直接连接到他们的计算机并且可以直接接受传入连接(没有NAT),只要NAT 后面的用户启动,您的程序概念就可以不加修改地工作。连接到具有静态IP的那个。