Java 客户端服务器中的客户端聊天CPU负载30-50%

Java 客户端服务器中的客户端聊天CPU负载30-50%,java,multithreading,sockets,client-server,chat,Java,Multithreading,Sockets,Client Server,Chat,客户端连接到服务器,服务器向客户端发送一条消息,客户端必须等待另一条消息。当客户端在While(true)循环中等待时,它将CPU加载到50%。我试着尽可能简单地做到这一点,以了解它是如何工作的 p.S.All catch()已隐藏以最小化此处的代码 客户: public class SocketClient { String host; int port; static Socket connection; BufferedReader bfr; publi

客户端连接到服务器,服务器向客户端发送一条消息,客户端必须等待另一条消息。当客户端在While(true)循环中等待时,它将CPU加载到50%。我试着尽可能简单地做到这一点,以了解它是如何工作的

p.S.All catch()已隐藏以最小化此处的代码

客户:

public class SocketClient 
{
   String host;
   int port;
   static Socket connection;
   BufferedReader bfr;

    public SocketClient(String host, int port)
    {
        this.port = port; 
        this.host = host;   
    }

    public void connect() throws UnknownHostException, IOException, Exception
    {
        connection = new Socket(new String(host), port);
        System.out.println("Client is ready.");

        bfr = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    }

     public void readInput() throws IOException
     {
           String input;   
           if(input = bfr.readLine()) != null)
           {
               System.out.println(input); 
           }
     }

      public static void main(String[] args) throws UnknownHostException, IOException, Exception 
      {
          SocketClient socketClient = new SocketClient("localhost", 19999);

           try {    
               socketClient.connect();

               try
               {
                  while(true)
                  {
                     socketClient.readInput();
                  }
               }

           }
     }
}
服务器:

   public class MultipleSocketServer implements Runnable {

  private Socket connection;
  private String TimeStamp;
  private int ID;

  static PrintWriter writer;
  private static File file;

  public static void main(String[] args) 
         throws FileNotFoundException, UnsupportedEncodingException 
  {

  int port = 19999;
  int count = 0;

  file = new File("E:/test.txt");
  writer = new PrintWriter(file, "UTF-8");

    try
    {
      ServerSocket socket = new ServerSocket(port);
      System.out.println("MultipleSocketServer Initialized");

      while (true) 
      {
        Socket connection = socket.accept();
        Runnable runnable = new MultipleSocketServer(connection, ++count);
        Thread thread = new Thread(runnable);
        thread.start();
      }
    }
  }


MultipleSocketServer(Socket s, int i) {
  this.connection = s;
  this.ID = i;
}

public void run() {
    try {

      System.out.println("Connected: " + connection.getLocalSocketAddress() + " at port " + connection.getPort());    
      writer.println(ID + ": " + connection.getLocalSocketAddress() + " at port " + connection.getPort());
      writer.flush();


      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
      writer.write("MultipleSocketServer repsonded at " + new java.util.Date().toString());
      writer.write("\n");
      writer.flush(); 

    }
    finally {
      try {
        connection.close();
     }
    }
   }
 }
分析 似乎服务器端在发送数据后关闭了连接

客户端具有以下无限循环:

while (true)
{
    socketClient.readInput();
}
循环可能导致CPU消耗:方法
bfr.readLine()
方法调用将在连接关闭后立即返回
null

解决方案

请考虑更改客户端的循环,直到“连接结束”:

分析 似乎服务器端在发送数据后关闭了连接

客户端具有以下无限循环:

while (true)
{
    socketClient.readInput();
}
循环可能导致CPU消耗:方法
bfr.readLine()
方法调用将在连接关闭后立即返回
null

解决方案

请考虑更改客户端的循环,直到“连接结束”:


你的问题是什么?请说明清楚,以便我们了解您的问题是什么以及我们如何帮助您您的问题是什么?请说明清楚,以便我们了解您的问题以及我们可以如何帮助您