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是我想要的,但我找不到任何简单实现的教程。。

您的循环只会以最快的速度发送数据,而在无法发送数据时会忙于等待。这必然会占用大量的CPU。一个简单的解决方案是只定期发送伪数据(因为它根本不需要发送(

我建议添加

Thread.sleep(100);

到发送循环,您的CPU应该会下降到1%左右。

你还可以做一些其他的改进,但都没有那么重要。

最新更新