【问题标题】:Java - communication through socketsJava - 通过套接字进行通信
【发布时间】:2018-01-16 21:46:12
【问题描述】:

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

【问题讨论】:

  • 是的,如果 ALL 设置正确 - 从连接到具有静态 IP/名称的服务器开始,localhost 就是应用程序正在执行的位置。也就是客户端机器。
  • 这个example 可以帮助您入门。我会用代码回答这个问题......但由于我没有测试过它,我不想浪费你的时间。

标签: java sockets jar chat communication


【解决方案1】:

是的,但是阻止用户这样做的主要障碍是一个叫做Network Address Translation(NAT)的小东西。

简而言之,绝大多数连接到 Internet 的计算机没有自己的、唯一的、公共 IPv4 地址(而且绝大多数也没有 IPv6 地址,因为 ISP 在推出 IPv6 方面拖了后腿,但是这完全是另一回事)。

专用服务器通常确实有(通常是多个)唯一的 IPv4 地址,但大量的 IP 地址通常只提供给运营自己的 Autonomous System 的托管公司——即便如此,如今购买 IP 的成本也非常高,因为它们是珍贵而稀有的商品。

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

这意味着默认情况下,来自公共互联网的入站连接会被 NAT 网关忽略。因此,如果您尝试打开到您朋友的公共 IP 的套接字,除非该网关(调制解调器/路由器)已正确配置,否则它将默默地忽略您的连接尝试,您将收到超时或“连接被拒绝”类型的消息.

有一些技术可以解决这个问题,但其中大多数要么需要更复杂的应用程序网络代码,要么需要用户在他们的路由器配置页面中乱搞(一般用户通常不愿意这样做) .

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

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

【讨论】:

    最近更新 更多