因此标题几乎说明了一切,我编写了一个客户端-服务器程序,问题是,即使没有客户端连接,该服务器也会消耗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();}
}
}
}