2013-04-30 167 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,然後查看問題是否仍然存在。

相關問題