2013-12-08 132 views
0

我試過讓一個簡單的服務器接受多個套接字&然後讓他們輸入和接收輸出。Java多客戶端服務器套接字獲取錯誤

但似乎我做錯了,因爲我收到很多錯誤。 我試圖做的不好嗎?我怎樣才能以更好的方式做到這一點?

我不明白爲什麼會出現這些錯誤:

Starting up.. 
Trying to listen... 
Server is successfully running on port 43594 
New connection: /127.0.0.1:60639 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 

和許多許多的錯誤線。它基本上一遍又一遍地循環着相同的錯誤,但是爲什麼?

我已經評論了代碼,所以你可以看到我試圖做的事情,也許修復了我這樣做的方式。

public class Server { 

    private int port = 43594; 

    public void listen() { 
     System.out.println("Trying to listen..."); 
     try { 
      final ServerSocket server = new ServerSocket(port); 
      // Create new thread to handle clients I/O 
      ClientHandler handler = new ClientHandler(server); 
      // START it 
      handler.start(); 
      System.out.println("Server is successfully running on port " + port); 
      while (true) { 
       // New connection found create a new Client object 
       Client cl = new Client(server.accept()); 
       cl.setup(); 
       // add it to clietns list in the I/O handler 
       handler.clients.add(cl); 
      }   
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    public static void main(String[] args) { 
     // start up 
     System.out.println("Starting up.."); 

     // server instance 
     final Server server = new Server(); 

     // create a new thread for server 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       // listen for new connections 
       server.listen(); 
      } 
     }).start(); 
    } 
} 

public class ClientHandler extends Thread { 

    private Thread handler; 
    public ArrayList<Client> clients = new ArrayList<Client>(); // client list 
    private ServerSocket server; 

    public ClientHandler(ServerSocket s) { 
     server = s; 
    } 

    public void run() { 

     while(true) { 
      // Loop every time through every client and see if he has wrote 
      // anything to do server. I am 100% sure this is wrong, how can I do this 
      // without using multithreads (thread per client)? 
      for (Client c : this.clients) { 
       if (c.getInputStream() != null) { 
        // found input, return a message. 
        c.sendMessage("hey client"); 
       } 
      } 
      try { 
       // sleep for 100ms 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public class Client { 

    private Socket socket; 
    private int clientId; 
    private BufferedReader inStream; 
    private PrintWriter outStream; 
    private boolean socketAlive = true; 

    public Client(Socket sock) { 
     this.socket = sock; 
    } 

    public void setup() { 
     setInputOutputStream(); 
     System.out.println("New connection: " + this.getIpAddress()); 
     this.sendMessage("Successfully connected!"); 
    } 


    public String getInputStream() { 
     String toReturn = ""; 
     try { 
      toReturn = this.inStream.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return toReturn; 
    } 

    private void setInputOutputStream() { 
     try { 
      inStream = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); 
      outStream = new PrintWriter(this.socket.getOutputStream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void sendMessage(String s) { 
     this.outStream.println(s); 
     this.outStream.flush(); 
    } 

    public String getIpAddress() { 
     return this.socket.getRemoteSocketAddress().toString(); 
    } 
} 

而且不知道這是否將是有益的,這是客戶端:

public class TestClient { 

    /** 
    * @param args 
    * @throws IOException 
    * @throws UnknownHostException 
    */ 
    public static void main(String[] args) { 
     try { 
      System.out.println("Client started"); 
      Socket sock = new Socket("localhost", 43594); 
      Scanner scanner = new Scanner(System.in); 
      String input; 
      PrintWriter out = new PrintWriter(sock.getOutputStream()); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream())); 

      input = scanner.nextLine(); 

      if (input != null) { 
       out.print(input); 
      } 
      if (reader.toString() != null) { 
       System.out.println(reader.toString()); 
      } 
     } catch (IOException e) { 
      System.out.println("Client error"); 
     } 

    } 

} 

爲什麼連接不斷得到復位?

回答

0

客戶端沒有循環或延遲,所以它會立即退出,只要它發送數據。當一個程序退出時,操作系統總是關閉它的所有網絡連接!

此外,我不認爲這是做你想做的事情:System.out.println(reader.toString());。檢查客戶端的輸出!

0

您正在從客戶端上未讀取的服務器上寫入內容。相反,客戶只是在打印後退出。 'reader.toString()不做任何I/O。你需要調用一個讀取方法。

相關問題