java - Server program taking lots of CPU even when not in use -
java - Server program taking lots of CPU even when not in use -
i have client/server java game im working on. there's bunch of code , im trying paste little possible while still giving enough.
when first start server, takes no cpu. when first game client connects, jumps 25%(which seems quite high does, thats not main concern yet). problem is, even when client disconnects, cpu usage of server app remains @ 25%.
the server takes name client , receives x, y coordinates player.
here code actual server run 1 time server started: (i apologize beforehand excessive indentation)
tcpserver(int port) { seek { tcpsock = new serversocket(port); int z = 0; while(true) { socket sock = tcpsock.accept(); sock.setkeepalive(true); clientlist.addelement(new tcpclient(sock)); clientlist.get(z).cr.start(); clientlist.get(z).cw.start(); clientlist.get(z).packs.addelement("?"); while(!clientlist.get(z).cr.namerecieved) { //do nil untill client has provided it's name } playerlist.addelement(new player(sock.getinetaddress(), clientlist.get(z).cr.playername)); playerlist.get(z).id=z; playerlist.get(z).name=clientlist.get(z).cr.playername; clientlist.get(z).packs.addelement("2 " + z); for(int j =0; j<playerlist.size();j++) { string status; if(playerlist.get(j).connected) status = "1"; else status = "0"; addtoqueue("3 " + playerlist.get(j).id + " " + playerlist.get(j).name + " " + playerlist.get(j).x + " " + playerlist.get(j).y + " " + playerlist.get(j).area + " " + status + " " ); } z++; addtoqueue("4 " + z); } } grab (ioexception e) { system.out.print(e); } }
and here code run each client. have commented out big portion of readability, code calculates , updates various location information. think problem occurring somewhere here in class.
public class tcpclient { socket sock; objectinputstream in; objectoutputstream out; clientread cr; clientwrite cw; public vector<string> packs = new vector<string>(); tcpclient(socket s) { this.sock = s; seek { sock.setkeepalive(true); } catch(exception e) { system.out.print(e); } cr = new clientread(); cw = new clientwrite(); } public class clientread extends thread { public boolean namerecieved = false; public boolean reading = true; string playername; public void run(){ try{ in = new objectinputstream(sock.getinputstream()); while(sock.isconnected() && reading) { //code retrieve , update user location } } catch(exception e){ system.out.print(e); } } }
and finally, short class write info client:
public class clientwrite extends thread { public boolean writing = true; public void run() { try{ out = new objectoutputstream(sock.getoutputstream()); out.flush(); while(sock.isconnected() && writing) { out.flush(); while(!packs.isempty()) { out.writeobject(packs.firstelement()); system.out.print(packs.firstelement()); packs.remove(0); out.flush(); } } } catch(exception e) { system.out.print(e); } } }
i know there's ton of code if sees anyting jumps out (especially threads) can explain behavior im getting. recap, server stays @ 0% cpu until client connects. after first client connects, no matter how many more connect, stays 25%-30% cpu. however, when of client have disconnected, cpu stays @ 25%-30% instead of going downwards 0.
the problem here:
while(!clientlist.get(z).cr.namerecieved) { //do nil untill client has provided it's name }
it spin loop smokes cpu. you're doing wrong. have accepted socket, must start new thread handle it. that thread should block until client has provided name part of protocol handshake, , update info structures. take loop shouldn't except take connections , start threads.
java performance sockets tcp tcpclient
Comments
Post a Comment