【问题标题】:Java - Is there a way a client and a server can connect via IPv4 without port forwarding?Java - 客户端和服务器是否可以通过 IPv4 连接而无需端口转发?
【发布时间】:2020-04-08 09:51:39
【问题描述】:

所以我试图在 Java 应用程序中连接两个客户端,但是以一种方式,一个客户端充当服务器,另一个客户端充当......客户端。我设法在本地连接它们,效果很好,但我一直在研究是否可以将客户端连接到不在同一网络上的服务器(通过 IPv4 或 IPv6)。我已经读过我应该在我的路由器服务器端进行端口转发。我知道如何进行端口转发,但不应该没有端口转发吗?如果我理解正确,只有服务器端应该被端口转发,服务器可以响应客户端而不需要客户端端口转发他们的路由器?因此,如果我是正确的,另一种解决方案将是一个“全局”第三方服务器(即端口转发),它将通过从一个客户端接收信息并将信息传递给另一个客户端来连接两个客户端?

我只是在这里学习,所以很抱歉,如果这里已经回答了这个问题,但我还没有在一个地方找到所有这些问题的答案,我正在努力得出一个结论。

【问题讨论】:

  • 如果您的 ADSL 路由器(和/或您的 Internet 服务提供商)进行网络地址转换,那么您必须进行端口转发。虽然不是编程问题。

标签: java sockets


【解决方案1】:

是的,您可以从网络外部访问计算机并连接到服务器 您必须在包含服务器的设备上下载(ngrok)工具并运行该工具 客户端无需转发端口即可联系服务器

ngrok

通过下载链接解释该工具在网站上的使用

【讨论】:

  • 我使用 Java for Windows 编写了很多聊天和文件传输程序。遇到问题可以分享代码
  • 我会给 ngrok 一个机会,谢谢你的推荐 :-)
【解决方案2】:

不应该没有端口转发吗

是的,您可以在没有port-forwarding 的情况下在两台机器之间建立连接。

示例:Web 服务器

以网络服务器为例。默认情况下,Web 服务器坐在那里监听 port 80,其中 80 是 port assigned by conventionHTTP

Web 客户端(浏览器等)通过尝试连接端口 80 来发送请求。如果途中没有障碍物,则连接继续进行。

限制端口访问

但是,可能会有障碍。

一个常见障碍:出于安全原因,面向Unix 的操作系统(BSD、macOS、Solaris、Linux、AIX 等)按照惯例限制对编号低于 1,024 的端口的访问。操作系统会阻止端口 80 上的任何传入连接。有了安全阻止,Web 请求就永远不会到达服务器。

使用包过滤工具进行端口转发

克服此限制的一种方法是让 Web 服务器在不受限制的端口上侦听,该端口编号高于 1,024,最大为 64K 限制,例如 8080。然后在服务器计算机的操作系统上配置 packet filter 工具做端口转发。对端口 80 的传入请求更改为转到端口 8080。

然后在 Web 服务器和 Web 客户端之间建立连接。

  • 客户端认为它正在通过端口 80 与服务器通信。
  • 服务器认为客户端请求了 8080 端口。

使用中间的数据包过滤工具即时更改数据包,服务器和客户端都不会更明智地处理数据包被更改。

您可能希望将防火墙配置为仅在 80 上允许来自计算机外部的 HTTP 连接,包括阻止对 8080 的任何外部请求。在这种情况下,只有从 80 更改为 8080 的数据包才会到达您的 Web 服务器。通常的做法是关闭服务器上尽可能多的端口。

仅供参考:对于加密的 HTTP (HTTPS),常规端口是 443 而不是 80。

不是编程问题

请注意,这里没有编程问题。作为程序员,您的客户端软件应尝试连接您感兴趣的服务器所记录的端口号。在服务器端机器或服务器端路由器上,将根据需要配置端口转发。您的客户端程序不关心甚至不知道任何可能存在或不存在的端口转发。端口转发是一个network-admin 问题,对程序员应该是透明的。

查看姐妹网站的网络问题

作为网络管理员问题,请查看姐妹网站,例如 Server FaultNetwork Engineering,而不是 Stack Overflow

【讨论】:

  • 非常感谢您的详细解答!我尝试过使用端口 80,但我立即放弃了这个想法,因为我使用它受到限制(我在 Ubuntu 上)。看起来这实际上是我将使用的更好的解决方案之一,并将端口 80 更改为端口 8080。谢谢:-)。
  • @Glavatar 顺便说一句,数据包过滤工具已经随着较旧的工具被较新的工具取代。有时它们会同时安装在一个操作系统上。在投入时间学习时,您可能希望专注于更新的工具。例如,my Question on macOS El Capitan.
猜你喜欢
  • 2021-03-27
  • 1970-01-01
  • 2019-09-10
  • 2015-05-21
  • 1970-01-01
  • 2021-01-07
  • 2016-02-23
  • 1970-01-01
  • 2016-10-08
相关资源
最近更新 更多