Java - 通过套接字进行通信

时间:2018-01-16 21:46:13

标签: java sockets jar chat communication

让我们说,在一个程序中,有能力连接到套接字和服务器(这将是我自己的计算机 - localhost),并具有与服务器进行通信并返回的所有处理(接收和发送消息,如聊天服务)。如果我将此程序作为.jar文件发送给其他用户各自的机器,当用户执行程序时,它将连接到此套接字和服务器。如果所有设置都正确(从套接字输入流和输出流中正确写入和读取)并在GUI聊天框中显示消息,那么这两个用户是否能够与此聊天服务进行通信?

1 个答案:

答案 0 :(得分:1)

是的,但阻止用户执行此操作的主要障碍是一个名为Network Address Translation(NAT)的东西。

简而言之,绝大多数连接到互联网的计算机没有自己独特的公共IPv4地址(绝大多数也没有IPv6地址,因为互联网服务提供商正在拖延推出IPv6,但是这完全是另一回事。

专用服务器通常具有(通常是多个)唯一的IPv4地址,但是大量的IP地址通常仅供运营自己Autonomous System的托管公司使用 - 即使这样,现在购买IP也非常价格昂贵,因为它们是一种有价值的稀有商品。

无论如何,在某种家庭互联网连接上的两个随机用户(如有线,DSL或光纤)几乎肯定有某种执行的路由器调制解调器 NAT,为每个用户设备(计算机,平板电脑等)提供自己的专用LAN IP,而不是为每个设备提供唯一的公共IP。

这意味着NAT网关默认忽略来自公共Internet的入站连接。因此,如果您尝试向朋友的公共IP打开套接字,除非已正确配置该网关(调制解调器/路由器),否则它将默默地忽略您的连接尝试,并且您将超时或"连接被拒绝"输入消息。

有一些技巧可以解决这个问题,但是大多数技术要么需要更复杂的应用程序网络代码,要么需要用户在路由器配置页面中乱七八糟(临时用户通常不愿意做)。

  • Port forwarding:用户必须手动将其路由器配置为"转发"公共IP端口到特定的专用IP,从而允许公共IP上的连接尝试将通过网络地址转换表传递到专用LAN。由于路由器/网关设备之间的差异,没有用户干预就没有通用的自动化方法。
  • NAT Traversal,需要在您的程序中实现各种NAT-T协议之一,要求所涉及的路由器明确支持所需的NAT-T协议(你和你的朋友)。有许多不同的NAT-T协议可用;根据兼容性,可用性等,由您决定使用哪一个
  • 使用插入服务器作为在两者之间路由数据包的间接方式:在这种情况下,您在公共Internet上创建一个服务器 具有唯一IP(或将端口转发给它) ),并让两台客户端计算机中的每一台启动到该服务器的出站连接。服务器将接受来自两个客户端的连接,然后处理数据包并将其传递,例如通过中间人与某人交谈。这并不需要在客户端上进行任何特殊配置,只要它们可以在所需端口上进行出站连接(默认情况下,大多数都可以,除了在受限制的企业环境中,您的端口可能限制为80和443。)

如果您的客户使用NAT,您需要采用其中一种技术。如果您的某个客户端的静态IP直接连接到他们的计算机并且可以直接接受传入连接(没有NAT),只要NAT 后面的用户启动,您的程序概念就可以不加修改地工作。连接具有静态IP的那个。