2017-06-23 70 views
-3

我想用Java做一個小型的服務器,但是我被卡住了。 在有人提到有關端口轉發的任何內容之前,是的,我已經這麼做了。這個SocketChannel連接有什麼問題?

現在,問題所在。 這是我的連接代碼:

InetSocketAddress addr = new InetSocketAddress(ip,5102); 

socketChannel = SocketChannel.open(addr); 

System.out.println("Connected"); 

它確實當我運行它,但是當我的朋友嘗試它,它不工作的工作。

這是我的服務器代碼:

InetSocketAddress addr = new InetSocketAddress("",5102); 

serverSocketChannel = ServerSocketChannel.open(); 

serverSocketChannel.bind(addr); 

new Thread(new Server()).start(); 

而且,並不是相關的,但我只是想在這裏添加這個,所以它不會造成任何混亂。 這是服務器的線程。

@Override 
public void run() { 
    while(true) { 
     try { 
      serverSocketChannel.accept(); 

      System.out.println("newuser"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我沒有得到任何錯誤消息,但我的朋友得到一個的ConnectException:連接超時:連接,這是追溯到Client.java:13,

socketChannel = SocketChannel.open(addr); 

我肯定該故障位於SocketChannel.open(...)函數中,因爲它們從來沒有得到「連接」消息,但是我的客戶端確實是這樣。

+0

我敢打賭,這是你使用變量的大寫名稱。或者,也許這是因爲你的端口轉發不能按預期工作/你使用錯誤的IP /防火牆/ ......你也確定'configureBlocking(false)'?使用非阻塞io的代碼相當複雜(例如https://stackoverflow.com/questions/15248555/how-to-switch-blocking-mode-of-socketchannel),並且很容易看不到錯誤。 – zapl

+0

嘗試使用斷點調試您的代碼。 –

+0

我嘗試使用斷點,我已經達到了它的結論是關於我的朋友計算機上的SocketChannel.open(...)。正如我所說,它在我自己的電腦上工作。我也試過切換端口和其他東西,並且我確認我的portforward正確,因爲我託管的其他服務器(例如我的web服務器和ssh)除了我創建的服務器之外工作得很好。 – XMan3

回答

0

因此,經過很多小時的投入,我找到了一個解決方案。

的部分

InetSocketAddress addr = new InetSocketAddress("",5102); 

是不是應該有一個 「」,。 替換之後,

InetSocketAddress addr = new InetSocketAddress(5102); 

它工作沒有任何問題。