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

标签 java multithreading sockets client-server chat

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

附注所有 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

解决方案

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

String input;
while ((input = bfr.readLine()) != null) {
    System.out.println(input);
}

关于java - 客户端-服务器聊天中的客户端 CPU 负载 30-50%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33136565/

相关文章:

java - Apache wicket 按钮 setMarkupId 不起作用

c - 简单的C程序来说明乱序执行?

c - 服务创建socket失败怎么办?

c# - 从telnet服务器C#套接字读取响应

java - 新的 JUnit 4.8.1 @Category 渲染测试套件是否几乎过时了?

java - 配置 riak-java-client 使用 https 代理

python - 为什么 python threading.Thread 对象有 'start' ,但没有 'stop' ?

java - 如何唤醒等待中的SwingWorker?

android - 如何在 Android 和 QT 之间使用 TCP 套接字传输对象?

java - 将图像解压缩到 blobstore