簡體   English   中英

Java Socket / Serversocket WAN連接

[英]Java Socket/Serversocket WAN Connection

我試圖從我的計算機中制作服務器,以便他們的計算機上的客戶端可以連接並與我的計算機通信。 我在端口31350上創建了服務器,客戶端正在嘗試通過我的路由器的IP地址連接。 但是當我在套接字創建的參數中有“localhost”或我的計算機名稱時,它只能通過局域網工作。 而不是當我使用我的IP地址,在不同的網絡上運行客戶端和服務器。 這是代碼。

這是我的計算機正在運行的服務器。

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);
}

這就是我運行客戶端時所說的內容

線程“main”中的異常java.net.ConnectException:連接超時:連接java.net.DualStackPlainSocketImpl.connect0(本地方法)java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69)at java.net.AbstractPlainSocketImpl .doConnect(AbstractPlainSocketImpl.java:339)java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200),java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182),java.net.PlainSocketImpl.connect(PlainSocketImpl。 java:157)at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)at java.net.Socket.connect(Socket.java:579)at java.net.Socket.connect(Socket.java:528)at at java.net.Socket。(Socket.java:425)at java.net.Socket。(Socket.java:241)at ClientTest.main(ClientTest.java:22)// 22是行socket = new Socket(InetAddress) .getByAddress(服務器B),31350);

防火牆已禁用。 我的路由器上的端口31350被轉發到我在cmd中使用ipconfig獲得的計算機的本地IP地址。 但它仍然無法正常工作,我只是在嘗試從客戶端計算機創建套接字時獲得IOException。 服務器計算機上沒有任何操作。 怎么了?

[更新]

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

基本上,您對路由器進行編程,以便端口31350上的任何連接請求都將通過LAN的​​本地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冗余文本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM