2013-04-30 154 views
2

我一直在处理一个小型服务器/客户端项目,并且遇到阻碍我进度的小问题。尝试连接外部IP时连接被拒绝

我想我钉的核心程序(客户端和服务器),我设法用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) 

我知道这些帖子得到有点儿乱,所以我上传的代码要点。如果有人希望我在这里添加它,让我知道,我会的。

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

需要注意以下几点:

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

如果有人知道我在做什么错,或者我什么都没做好,请告诉我,我非常感谢。

+0

防火墙?权限? Mac OS可能会主动拒绝提供的端口上的连接 – MadProgrammer 2013-04-30 01:53:25

+0

我在Windows上试过并得到同样的问题。我不认为这是一个操作系统问题。 – 2013-04-30 01:56:19

+0

仍然可能是防火墙问题。您尝试从本地网络或外部连接(从网络/ VPN) – MadProgrammer 2013-04-30 01:57:27

回答

0

我不是Mac的专家,但基于lsof的输出,似乎你的程序绑定在IPv6地址上。它可以在本地主机上正常工作,但如果你尝试一个公共IP地址(并使用IPv4),它可能是你的问题的根源。至于端口号,在UNIX等操作系统上,您需要拥有对低于1024的用户端口的root用户访问权限。任何方式,您都应该尝试在Mac上禁用IPv6,然后查看问题是否仍然存在。