【问题标题】:Open socket server to clients outside of localhost向本地主机之外的客户端打开套接字服务器
【发布时间】:2020-05-11 20:01:42
【问题描述】:

TLDR:允许不在本地主机上的人连接到我的聊天服务器,如果他们有服务器 IP。

我开始学习 Java 中的套接字编程,但遇到了一个我似乎无法弄清楚的问题。我已经使用套接字创建了一个带有服务器和客户端的基本聊天程序。这在 localhost 中完美运行,但我想与我的朋友分享。我已经搜索了几个小时,但无法真正找到解决方案。根据我的阅读,我需要将我的 ServerSocket 与我的 IP 或端口转发绑定。只是寻找一些我可以采取的澄清和可能的步骤。

我如何启动服务器

ServerSocket server = new ServerSocket(5056);

我如何连接到服务器

Scanner readIp = new Scanner(System.in);
 String ip = readIp.nextLine();
 socket = new Socket(InetAddress.getByName(ip), Integer.parseInt("5056"));

我看过的帖子

Java Socket port forwarding

https://coderanch.com/t/571967/java/connect-machine-localhost

What does it mean to bind() a socket to any address other than localhost?

【问题讨论】:

  • 这些机器的防火墙中是否打开了端口?如果还有路由器或其他东西,你必须激活端口转发到电脑
  • 我想首先,我需要更改代码中的任何内容吗?
  • 不,正如你所说,如果它在本地工作,这只是一个配置问题

标签: java sockets networking


【解决方案1】:

“允许不在本地主机上的人连接到我的聊天服务器,如果他们有服务器 IP。”在您的局域网之外:

  1. 公共“白色”外部 IP。

例如,此页面https://whatismyipaddress.com/ 应显示与您的操作系统中显示的完全相同的 IP 地址

  1. 在 ISP 级别上未阻止传入连接:您的 ISP 应允许从 Internet 到您的计算机的传入连接。
  2. 一些打开的端口,未被本地防火墙或 ISP 阻止。 通常,低于 1024 的所有端口都被阻止用于 ISP 级别的输入。
  3. 不存在 NAT(存在排除项,但不在本主题范围内),这对于 WiFi/3/4/5g 家庭路由器很常见。

正如您可能已经理解的那样 - 这很复杂。

使用外部服务会更快,例如https://portmap.io/

它进行 VPN 连接 + 端口转发,因此从互联网上敲他们的服务器实际上会调用您的本地聊天服务器。

【讨论】:

  • 感谢您的回复。那么,如果我想使用我的家庭 IP 在我的计算机上托管 ChatServer,然后将该 IP 提供给我的朋友以便他们可以连接到它,我是否需要更改我的代码?因为我试图将我的 IP 绑定到 SocketServer 并且它引发了连接错误。
  • 你的代码没问题。您的服务器将监听机器的所有内部和外部 IP 地址。问题完全与网络基础设施有关,可能涉及 NAT、防火墙和路由器。这些通常设置为使外部世界难以访问您家中的计算机,因为这样可以保护您的计算机免受攻击。
  • 所以我仍在努力解决这个问题。我在防火墙上打开了端口,但我的服务器在 ip 0.0.0.0 上运行。我做了一些研究,如果我理解正确,这意味着我的服务器对所有内部和外部地址都是开放的,但是当我尝试使用我的家庭 IP 连接时,我仍然无法连接到我的服务器,甚至出现连接被拒绝错误地址。
猜你喜欢
  • 1970-01-01
  • 2014-07-23
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多