【问题标题】:Connection refused when trying to connect with an external IP尝试连接外部 IP 时连接被拒绝
【发布时间】:2013-04-30 01:39:45
【问题描述】:

我一直在做一个小型服务器/客户端项目,但遇到了一个阻碍我进步的小问题。

我认为我已经确定了程序(客户端和服务器)的核心,并且我设法使用localhost 将两者连接起来,但是当我尝试通过我的外部 IP 进行连接时,我得到了一个异常:

java.net.ConnectException: Connection refused
java.net.PlainSocketImpl.socketConnect(Native Method)
java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
java.net.Socket.connect(Socket.java:529)
java.net.Socket.connect(Socket.java:478)
java.net.Socket.<init>(Socket.java:375)
java.net.Socket.<init>(Socket.java:218)
networking.Client.run(Client.java:183)
java.lang.Thread.run(Thread.java:680)

最初我尝试使用端口 10,但发现 0 到 1023 之间的端口由于某种原因在 Mac 上不起作用,所以我选择了该范围之外的端口。与localhost 连接有效,但是当我尝试与我的外部 IP 连接时(就像普通用户一样),我得到了那个异常。我的端口被正确转发并且运行sudo lsof -i tcp -nP(对于Mac 为netstat)将表明实际上我的服务器实际上正在侦听正确的端口。这让我相信问题可能出在我的客户身上,但我真的不知道。

这是来自 Terminal.app 的sudo lsof -i tcp -nP 输出:

COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java      35423 MeshulamSilk   41u  IPv6 0xc949f3cdb29dfdcd      0t0  TCP *:63370 (LISTEN)
java      35423 MeshulamSilk   42u  IPv6 0xc949f3cdbbf1b96d      0t0  TCP [::1]:63992->[::1]:63991 (TIME_WAIT)

我知道这些帖子有点乱,所以我将代码上传到 Gist。如果有人想让我在这里添加它,请告诉我,我会的。

The code for both the server and client can be found here.

注意事项:

  • MooConsole 是我编写的一个库,它为导出的程序提供控制台。我在客户端和服务器中都使用它来显示文本。
  • MooCommands 是我的另一个库,它代表您可以从控制台运行的命令。
  • SocketThread 是一个处理新连接的类。这使服务器能够同时连接多个客户端。它扩展了java.lang.Thread。我不认为它会导致问题,所以我不包括它,但如果有必要,我可以。
  • Operations.DISCONNECT 是一个枚举常量,代表断开连接。

如果有人知道我做错了什么或我根本没有做的事情以及其他任何事情,请告诉我,我将不胜感激。

【问题讨论】:

  • 防火墙?权限? Mac OS 可能会主动拒绝提供的端口上的连接
  • 我在 Windows 上尝试过,也遇到了同样的问题。我认为这不是操作系统问题。
  • 可能仍然是防火墙问题。您是尝试从本地网络内连接还是从外部(从网络/VPN)连接
  • 我尝试从我的计算机连接到我计算机上的服务器,从我的计算机连接到外部服务器,并让外部人员连接到我计算机上的服务器。没有工作。如果是防火墙问题:我将如何解决?
  • 好的,那么,您是尝试从同一内部本地网络上的 PC 连接,还是他们尝试从外部世界连接。您是否(暂时)禁用了防火墙?服务器是否允许您正在侦听的端口上的传入连接?

标签: java networking


【解决方案1】:

我不是 Mac 专家,但根据 lsof 的输出,您的程序似乎只绑定了 IPv6 地址。它可以在 localhost 上正常工作,但如果您尝试使用公共 IP 地址(并​​使用 IPv4),它可能是您问题的根源。至于端口号,在 UNIX 等操作系统上,您需要对 1024 以下的用户端口具有 root 访问权限。无论如何,您应该尝试在 Mac 上禁用 IPv6,看看问题是否仍然存在。

【讨论】:

    猜你喜欢
    • 2021-11-16
    • 2019-10-20
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多