2014-10-03 46 views
0

我在java中實現了一個能夠處理多個客戶端的echo服務器。即使在運行多個客戶端時,一切都可以在本地運行。但是當試圖在另一臺計算機上運行客戶端時,我們得到Java回聲服務器連接超時問題

java.net.ConnectException: Connection timed out: connect 

輸出中。所以我的問題是,這可能是什麼原因造成的?這是我第一次使用服務器,而且我有點迷路。

端口號爲1100.

以下是服務器的類。

ThreadedEchoServer:

import java.net.*; 
import java.io.*; 

public class ThreadedEchoServer { 

public static void main(String[] args) throws IOException { 

if (args.length != 1) { 
    System.err.println("Usage: java ThreadedEchoServer <port number>"); 
    System.exit(1); 
} 

    int portNumber = Integer.parseInt(args[0]); 
    boolean listening = true; 

    try (ServerSocket serverSocket = new ServerSocket(portNumber)) { 
     while (listening) { 

      new EchoThread(serverSocket.accept()).start(); 
       System.out.println("connected"); 
     } 
    }catch (IOException e) { 

    System.err.println("Could not listen on port " + portNumber); 
    System.exit(-1); 
    } 
} 
} 

EchoThread:

import java.net.*; 
import java.io.*; 

public class EchoThread extends Thread { 
private Socket socket = null; 

public EchoThread(Socket socket) { 
    super("EchoThread"); 
    this.socket = socket; 
} 

public void run() { 

    try (
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(
      new InputStreamReader(
       socket.getInputStream())); 
    ) { 
     String inputLine, outputLine; 
     while ((inputLine = in.readLine()) != null) { 
      out.println(inputLine); 
      outputLine = inputLine; 
      if (outputLine.equals("Bye")) //If neccesassy to break using a command 
       break; 
     } 

     socket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

}

最後,回聲客戶:

import java.io.*; 
import java.net.*; 

Epublic class EchoClient { 
public static void main(String[] args) throws IOException { 

    if (args.length != 2) { 
     System.err.println(
      "Usage: java EchoClient <host name> <port number>"); 
     System.exit(1); 
    } 

    String hostName = args[0]; 
    int portNumber = Integer.parseInt(args[1]); 

    try (
     Socket echoSocket = new Socket(hostName, portNumber); 
     PrintWriter out = 
      new PrintWriter(echoSocket.getOutputStream(), true); 
     BufferedReader in = 
      new BufferedReader(
       new InputStreamReader(echoSocket.getInputStream())); 
     BufferedReader stdIn = 
      new BufferedReader(
       new InputStreamReader(System.in)) 
    ) { 
     String userInput; 
     while ((userInput = stdIn.readLine()) != null) { 
      out.println(userInput); 
      System.out.println("echo: " + in.readLine()); 
     } 
    } catch (UnknownHostException e) { 
     System.err.println("Don't know about host " + hostName); 
     System.exit(1); 
    } catch (IOException e) { 
     System.err.println("Couldn't get I/O for the connection to " + 
      hostName); 
     System.exit(1); 
    } 
} 

}

+0

任何防火牆存在? – Smutje 2014-10-03 19:36:15

+0

我們都關閉了我們的防火牆。 – user2833297 2014-10-03 19:37:05

+0

但你們都在同一個本地網絡?你沒有通過互聯網與他連接嗎?爲了使這項工作通過互聯網嘗試將它與一個VPN客戶端,如hamachi – user2504380 2014-10-03 20:01:33

回答

0

對於我來說,Oracle Java和OpenJDK 1.7.0_55與客戶端和服務器運行一個Ubuntu 13.10和Windows 7(切換爲一個運行的客戶端,另一個服務器上運行的服務器)的代碼工作正常。

確實存在網絡配置問題(防火牆,NAT)。您可以從遠程客戶端機器上嘗試telnet host port(即telnet megadeth 1100)查看另一個打開的端口,以確認您是否超時。