Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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-通过套接字进行通信_Java_Sockets_Jar_Chat_Communication - Fatal编程技术网

Java-通过套接字进行通信

Java-通过套接字进行通信,java,sockets,jar,chat,communication,Java,Sockets,Jar,Chat,Communication,比方说,在一个程序中,有连接到套接字和服务器(这将是我自己的计算机-localhost)的功能,并且有所有与服务器通信的处理(接收和发送消息,如聊天服务)。如果我将这个程序作为.jar文件发送给另外两个用户,他们各自的机器,当用户执行程序时,它将连接到这个套接字和服务器。如果所有设置都正确(从套接字inputstream和outputstreams正确写入和读取),并在GUI聊天框上显示消息,两个用户是否能够与此聊天服务通信?是的,但阻止用户这样做的主要障碍是一个称为(NAT)的小东西 简言之,

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

是的,但阻止用户这样做的主要障碍是一个称为(NAT)的小东西

简言之,绝大多数连接到互联网的计算机都没有自己的、唯一的公共IPv4地址(绝大多数也没有IPv6地址,因为ISP在推出IPv6方面步履蹒跚,但这完全是另一回事)

专用服务器通常有(通常有多个)唯一的IPv4地址,但大量IP地址通常只提供给自己运营的托管公司——即使如此,现在购买IP还是非常昂贵的,因为它们是一种珍贵而稀有的商品

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

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

有几种技术可以解决这个问题,但大多数技术要么需要复杂得多的应用程序网络代码,要么需要用户在路由器配置页面上乱来(一般用户不愿意这样做)

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

如果您的客户正在使用NAT,您需要采用这些技术之一。如果您的一个客户端有一个直接连接到其计算机的静态IP,并且可以直接接受传入连接(无NAT),则只要NAT后面的用户启动到具有静态IP的客户端的连接,您的程序概念就可以正常工作。

是,如果所有设置都正确-从使用静态IP/名称连接到服务器开始,localhost就是执行应用程序的地方。也就是说,客户端计算机。这可能会帮助您开始。我会用密码回答这个问题。。。但是因为我还没有测试过,所以我不想浪费你的时间。