-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(...)函數中,因爲它們從來沒有得到「連接」消息,但是我的客戶端確實是這樣。
我敢打賭,這是你使用變量的大寫名稱。或者,也許這是因爲你的端口轉發不能按預期工作/你使用錯誤的IP /防火牆/ ......你也確定'configureBlocking(false)'?使用非阻塞io的代碼相當複雜(例如https://stackoverflow.com/questions/15248555/how-to-switch-blocking-mode-of-socketchannel),並且很容易看不到錯誤。 – zapl
嘗試使用斷點調試您的代碼。 –
我嘗試使用斷點,我已經達到了它的結論是關於我的朋友計算機上的SocketChannel.open(...)。正如我所說,它在我自己的電腦上工作。我也試過切換端口和其他東西,並且我確認我的portforward正確,因爲我託管的其他服務器(例如我的web服務器和ssh)除了我創建的服務器之外工作得很好。 – XMan3