尝试连接外部IP时连接被拒绝

时间:2013-04-30 01:39:45

标签: java networking

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

我认为我将核心程序(客户端和服务器)钉在了核心上,然后我设法使用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是枚举常量,表示断开连接。

如果有人知道我做错了什么,或者我做得不怎么做,请告诉我,我非常感谢。

1 个答案:

答案 0 :(得分:0)

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