2014-04-30 80 views
0

目前我的java服务器工作正常,所有的客户端存储在一个新的线程,但不是那么擅长性能。Java服务器结构

我MainServer类

public class MainServer { 

    private ServerSocket server; 

    public MainServer(int port) { 

     try { 

      server = new ServerSocket(port); 
      System.out.println("Server started on port " + port + "..."); 
      ServerLoop(); 

     } catch (IOException e) { 

      System.out.println("[ERROR] Server cannot be started on port " + port + "..."); 
     } 
    } 

    public void ServerLoop() { 

     Thread serverLoop = new Thread(new Runnable() { 

      public void run() { 

       ServerDispatcher dispatcher = new ServerDispatcher(); 

       while (true) { 

        try { 

         Socket connectedClient = server.accept(); 
         dispatcher.connectedClients.add(connectedClient); 
         System.out.println("Client number - " + dispatcher.connectedClients.size() + " connected..."); 
         Thread clientThread = new Thread(new ClientHandler(connectedClient, dispatcher)); 
         clientThread.start(); 

        } catch (IOException e) { 

         e.printStackTrace(); 
        } 
       } 
      } 
     }); 

     serverLoop.start(); 
    } 
} 

因此,这部分将开始为每一个客户一个新线程,将客户端添加到调度客户端列表

ClientHandler的类

public class ClientHandler implements Runnable { 

    private Socket currentClient; 
    private ServerDispatcher handler; 

    public ClientHandler(Socket s, ServerDispatcher dispatcher) { 

     currentClient = s; 
     handler = dispatcher; 
    } 

    public void run() { 



     while (true) { 


     } 


    } 
} 

这是我ServerDispatcher类

public class ServerDispatcher { 

    public ArrayList<Socket> connectedClients; 

    public ServerDispatcher() { 

     connectedClients = new ArrayList<Socket>(); 
     CheckClients(); 
    } 

    public void CheckClients() { 

     Thread checkClients = new Thread(new Runnable() { 

      public void run() { 

       while (true) { 

        Integer clientSize = connectedClients.size(); 

        if (!clientSize.equals(0)) { 

         for (int i = 0; i < connectedClients.size(); i++) { 

          try { 

           BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connectedClients.get(i).getOutputStream())); 
           writer.write("1"); 
           writer.flush(); 
           //System.out.println("Checking"); 

          } catch (IOException e) { 

           int clientNumber = i + 1; 
           System.out.println("Client number - " + clientNumber + " disconnected..."); 
           connectedClients.remove(i); 
          } 
         } 
        } 
       } 
      } 
     }); 

     checkClients.start(); 
    } 
} 

而这将检查所有在线客户端...

问题是此服务器正在使用像67%的CPU在执行,我该如何改进代码?也许从ServerDispatcher中删除所有的线程,并离开客户端线程?

另一个问题:我想在我的while循环中发送一条消息给X客户端,但仅仅一次,我看着谷歌,似乎LinkedBlockingQueue是我在找什么,但我找不到任何教程轻松实现..

+0

难道'while(true){}'是什么导致它? –

+0

嗯,我真的需要同时实现真正的活命,我认为,(没有?) –

+1

TCP协议保持活着没有你需要发送任何连接在服务器上的客户端连接。 –

回答

2

你的循环只是发送数据的速度,因为它可以和忙等待时,它不能。这势必会使用大量的CPU。一个简单的解决方案是唯一定期发送伪数据(因为它并不真的需要在所有发送)

我建议增加

Thread.sleep(100); 

到发送环路和你的CPU应该下降到1左右%。

附近有作为显著的任何地方的一些其他方面的改进,你可以做,但没有。