2017-09-03 229 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

也许吧。随意找到一个并将其作为重复关闭。 –