2017-09-03 4 views
0

私は簡単なTCP/IPチャットに問題があります。私のサーバーは接続されたクライアントからのメッセージを受け取っていないように見えます。なぜそれが起こっているのかわかりません。 Serverコード:Javaクライアント/サーバーチャット

public class ChatServer { 

public static final int MAX_CLIENTS = 10; 
public static final ClientHandler[] clients = new ClientHandler[MAX_CLIENTS]; 

public void go(int port){ 
    try (ServerSocket serverSocket = new ServerSocket(port)) { 
     System.out.println("Connection established on port "+port); 
     System.out.println("Waiting for clients..."); 

     while (true){ 
      Socket clientSocket = serverSocket.accept(); 
      for (int i=0; i<clients.length;i++){ 
       if (clients[i]==null){ 
        ClientHandler clientHandler = new ClientHandler(clientSocket, clients); 
        clients[i] = clientHandler; 
        System.out.println("Added new client!"); 
        clientHandler.start(); 
        break; 
       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

ClientHandlerのクラス:

public class ClientHandler extends Thread { 

private Socket socket; 
private ClientHandler[] clients; 
private PrintWriter out; 

public ClientHandler(Socket clientSocket, ClientHandler[] clientsThreads){ 
    socket = clientSocket; 
    clients = clientsThreads; 
} 

@Override 
public void run() { 
    ClientHandler[] threads = this.clients; 
    try { 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     out = new PrintWriter(socket.getOutputStream(), true); 

     for (int i=0; i<threads.length;i++){ 
      if (threads[i]!=null){ 
       threads[i].out.println("***SERVER: New client entered the chat room!***"); 
      } 
     } 

     while (true){ 
      System.out.println("in while loop - reading and writing to the client socket"); 
      String inputLine = in.readLine(); 
      System.out.println(inputLine); 
      if (inputLine.startsWith("/quit")){ 
       break; 
      } 
      for (int i=0; i<threads.length;i++){ 
       if (threads[i]!=null){ 
        threads[i].out.println(inputLine); 
       } 
      } 
     } 
     System.out.println("One of the clients is leaving the chat room"); 

     for (int i=0; i<threads.length;i++){ 
      if (threads[i]==this){ 
       threads[i]=null; 
      } 
     } 
     out.close(); 
     in.close(); 
     socket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

そして、クライアントコード:

public class ChatClient { 

private Socket socket; 
private BufferedReader in; 
private PrintWriter out; 
private BufferedReader stdLine; 
private boolean closed = false; 


public void go(String hostName, int port){ 
    try { 
     initializeResource(hostName, port); 
     new Thread(new ServerReader()).start(); 
     while (!closed){ 
      out.println(stdLine.readLine().trim()); 
     } 
     in.close(); 
     out.close(); 
     socket.close(); 
     System.out.println("Goodbye!"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     System.out.println("Failed to connect, please try again."); 
    } 
} 

public void initializeResource(String hostName, int port) throws IOException { 
    socket = new Socket(hostName, port); 
    in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    out = new PrintWriter(socket.getOutputStream()); 
    stdLine = new BufferedReader(new InputStreamReader(System.in)); 
    System.out.println("Connection established!"); 
} 

public class ServerReader implements Runnable{ 
    @Override 
    public void run() { 
     String inputLine = null; 
     try { 
      while ((inputLine=in.readLine())!=null){ 
       System.out.println(inputLine); 
       if (inputLine.startsWith("Bye!")){ 
        closed = true; 
        return; 
       } 
      } 
      in.close(); 
      out.close(); 
      socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

} 

サーバーのためにこれらのアプリケーションを実行した結果:

Connection established on port 8000 
Waiting for clients... 
Added new client! 
in while loop - reading and writing to the client socket 

そして、クライアントのために:

Connection established! 
***SERVER: New client entered the chat room!*** 

クライアントのバージョンで私は、端末内のすべての時間をメッセージを書き込むことができますが、これらのメッセージのいずれも(そうでない場合は、メッセージがサーバの端末に書き込まれる)サーバーで受信していません。私はどんな提案も感謝します。

答えて

1

あなたは、クライアントからのラインを印刷した後フラッシュする必要があります。

while (!closed){ 
     out.println(stdLine.readLine().trim()); 
     out.flush(); 
    } 
+0

は、それが動作するようになりました、高速な応答をありがとうございました! – Donios

+0

これが答えであれば、何十万もの類似した質問が重複していないのでしょうか?おそらく、 –

+0

。自由に見つけて、重複して閉じることができます。 –

関連する問題