ServerSide应用程序消耗100%的CPU

时间:2018-08-07 02:38:17

标签: java loops server client infinite

因此标题几乎说明了一切,我编写了一个客户端-服务器程序,问题是,即使没有客户端连接,该服务器也会消耗INSANE的CPU能力,并且我认为这与无限使用while循环不断接受客户。

while (true) {
    try {
        Thread.sleep(500);
    } catch (InterruptedException e1) {}

    try {
        socket = serverSocket.accept();
    } catch (IOException e) {
        System.out.println("I/O error: " + e);
    }

    new CThread(socket).start();
    if(r == null) break;
}

这似乎总是使CPU过载,我确实知道这是一个无限循环,但它只是在浪费资源。有什么办法可以阻止这种情况?

我尝试将其删除,并发现性能要好得多。但只能接受1位客户。

如果相关,我怀疑是我的系统规格... 英特尔至强E5520 @ 2.27 GHz 24 GB DDR3 1333 MHz 和1 mbps以太网

这种死亡循环是否有其他简单的选择?还是我做错了什么?下面是我用来运行整个程序的CThread类。

编辑:这是在我找到解决方案之后,对于尝试执行此操作的其他所有人,请确保您包含“ return;”。在您尝试抓住循环内。因为,当客户端断开连接并且服务器发送其数据包之类的消息时,它将引发Exception异常,该异常随后将调用Catch并运行“ return;”。将会终止线程。

class CThread extends Thread {
    protected Socket s;
    public ObjectOutputStream out;
    public ObjectInputStream in;
    public Player p = null;
    public static worldTile wt = null;  
    public CThread(Socket clientSocket) {
        this.s = clientSocket;
        System.out.println("New Client :D");
    }
    public synchronized void run() {

        try {
            out = new ObjectOutputStream(s.getOutputStream());
            in = new ObjectInputStream(s.getInputStream());
            out.flush();
            out.writeObject("Welcome client :)");
        } catch (IOException e) {
            return;
        }

        while (true) {
            try {
            String d = (String) in.readObject();
               if(d.startsWith("Login:[")) {//Login:[user,pass]
                   String[] args = d.substring("Login:[".length(), d.indexOf("]")).split(",");
                   int log = login(args);
                   if(log != -1)
                       p = new Player(log);
                   out.writeObject(log);
               }
               else if(d.startsWith("Register:[")) {//Register:[user,pass]
                   String[] args = d.substring("Register:[".length(), d.indexOf("]")).split(",");
                   int reg = register(args);
                   if(reg != -1)
                       p = new Player(reg);
                   out.writeObject(reg);
               }
               else if(d.startsWith("Tile:[")) {//Tile:[w,x,y]
                   Tile t = (Tile) in.readObject();
                   String[] args = d.substring("Tile:[".length(),d.indexOf(']')).split(",");
                   int[] a = new int[3];
                   for(int x = 0; x < args.length; x++) {
                       a[x] = Integer.parseInt(args[x]);
                   }
                   if(wt.worldid==a[0]) {
                       wt.info[a[1]][a[2]] = t;
                   }
                   else {
                       wt.write();
                       wt = new worldTile("world"+a[0]);
                       wt.info[a[1]][a[2]] = t;
                   }
               }
               else if(d.startsWith("Position:")) { // Position:[w]
                   int world = Integer.parseInt(d.substring("Position:".length()));
                   out.writeObject(new BufferTile("world"+world));
               }
               else if(d.startsWith("Gib Bank")) {
                   out.writeObject(p.n.bank);
               }
               else if(d.startsWith("Gib Layout")) {
                   out.writeObject(PlayerManager.worlds);
               }

            } catch (ArrayIndexOutOfBoundsException e) {
                e.printStackTrace();
                try {
                    wt.write();
                    p.logout();
                } catch(Exception e2) {}
                //System.out.println("Connection Error!");
            }
            catch(IOException e) {}
            catch(ClassNotFoundException e) {e.printStackTrace();}
        }
    }
}

0 个答案:

没有答案