2012-11-09 54 views
4

我試圖從我的電腦中創建一臺服務器,以便他們的電腦上的客戶端可以連接並與我的電腦通信。我在31350端口上創建了服務器,客戶端正在嘗試通過我的路由器的IP地址進行連接。但它只能通過LAN工作,當我有「本地主機」或我的計算機的名稱創建套接字的參數。而不是當我使用我的IP地址時,在不同的網絡上運行客戶端和服務器。這是代碼。Java Socket/Serversocket廣域網連接

這是我的電腦運行的服務器。

public static void main (String[] args) throws IOException 
{ 
    ServerSocket server = new ServerSocket(31350); 
    Socket client1 = server.accept(); 
} 

這裏是我的朋友是他的計算機上運行的客戶端代碼

public static void main(String[] args) throws IOException, UnknownHostException 
{ 
    Socket socket; 

    // #'s are what I got from whatismyip.org on the server computer) 
    byte[] serverb = new byte[] {(byte)##, (byte)##, (byte)###, (byte)###}; 

    socket = new Socket(InetAddress.getByAddress(serverb),31350); 
} 

這是什麼,當我在線程中運行客戶端

異常「主要」 java.net它說.ConnectException:連接超時:在java.net上的java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69) 上的java.net.DualStackPlainSocketImpl.connect0(Native Method) 處連接 。 AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 在java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 在java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 在java.net.PlainSocketImpl。在java.net.Socket.connect(Socket.java:579) 上的java.net.SocketSocketImpl.connect(SocksSocketImpl.java:391) 連接(PlainSocketImpl.java:157) Socket.java:528) at java.net.Socket。(Socket.java:425) at java.net.Socket。(Socket.java:241) at ClientTest.main(ClientTest.java:22)// 22是socket socket = new Socket(InetAddress.getByAddress(serverb),31350);

防火牆已禁用。我的路由器上的端口31350被轉發到我的計算機的本地ip地址,我使用ipconfig在cmd中獲得。但它仍然不起作用,我試圖從客戶端計算機創建套接字時發生IOException。服務器計算機上沒有任何反應。怎麼了?

回答

3

[更新]

如你所料,連接超時表示這是某種網絡問題。來自客戶端的數據包沒有到達服務器機器。確切的解決方案將取決於路由器的類型,但谷歌的術語是「端口轉發」。這是我隨機發現的一篇文章,可能有所幫助:http://www.rhinosoft.com/KnowledgeBase/kbarticle.asp?RefNo=1289

基本上你編程的路由器,以便在端口31350的任何連接請求將被轉發到您的計算機在本地IP地址的局域網。

祝你好運!

[原創評論]

這比回答的評論(但我需要多一些空間)。你的try catch邏輯會使診斷問題變得更加困難。簡化代碼如下:

public static void main(String[] args) throws IOException, UnknownHostException 
{ 
    Socket socket; 

      // #'s are what I got from whatismyip.org on the server computer) 
    byte[] serverb = new byte[] {(byte)##, (byte)##, (byte)###, (byte)###}; 

    socket = new Socket(InetAddress.getByAddress(serverb),31350); 
} 

只是讓原有的IOException異常傳播和更新您的問題,包括異常堆棧跟蹤。最初的例外包含有價值的信息 - 如果它表示連接被拒絕,則意味着一件事 - 可能您的端口號不正確。如果它表示連接超時,則意味着其他事情 - 要麼確實存在防火牆問題,要麼您的IP地址錯誤。

你的代碼捕捉有用的異常,吞下它並拋出一個不太有用的異常。

做同樣的事情到你的服務器代碼:

public static void main (String[] args) throws IOException 
{ 
    ServerSocket server = new ServerSocket(31350); 
    Socket client1 = client1 = server.accept(); 
} 

堆棧跟蹤將顯示哪些方法拋出異常,所以你不需要像InetAddress creation failed

+0

由於多餘的文字,那竟然是問題。我沒有正確轉發外部端口的端口 – user1813598