multithreading - Java socket client fail to receive message in time -
i writing client-server-client checker game program. now, testing whether program can send , move message correctly.
but, after set network, if call client1.sendmove(move1)
send move client2 , check whether client2 gets movement client2.getmove()
, got null.
however, if call client1.sendmove(move2)
, call client2.getmove()
again, move1
. don't know problem is.
client:
private socket socket; private string serverip; private outputstreamwriter writer; private gameclientreader readerthread; public gameclient(string host){ this.serverip = host; try{ //connect server socket = new socket(inetaddress.getbyname(serverip), 1234); system.out.println("client: succeeded connect server!"); writer = new outputstreamwriter(this.socket.getoutputstream(), "utf-8"); //start new thread reading server this.readerthread = new gameclientreader(socket); new thread(readerthread).start(); }catch(ioexception e){ system.out.println("client failed connect!"); e.printstacktrace(); } } public void sendmessage(string msg){ try{ system.out.println("sending: " + msg); writer.write(msg); writer.write('\n'); writer.flush(); }catch(ioexception e){ e.printstacktrace(); } } public void sendmove(piecemove move){ gson gson = new gson(); string jsonstr = gson.tojson(move); this.sendmessage(jsonstr); } public piecemove getmove(){ gson gson = new gson(); string msg = this.readerthread.getcurrentmessage(); system.out.println("currmove: " + msg); piecemove move = gson.fromjson(msg, piecemove.class); return move; }
clientthread:
private socket socket; private bufferedreader reader; private string currmessage; public gameclientreader(socket soc){ this.socket = soc; try{ reader = new bufferedreader(new inputstreamreader (this.socket.getinputstream(), "utf-8")); }catch(ioexception e){ e.printstacktrace(); } } public void run(){ while(true){ receive(); } } private void receive(){ try { this.currmessage = reader.readline(); } catch (ioexception e) { e.printstacktrace(); } } public string getcurrentmessage(){ system.out.println("curmsg :" + this.currmessage); return this.currmessage; }
server:
private socket socket; private serversocket serversocket; private arraylist<gameserverthread> threads; public gameserver(){ try{ //create new server socket serversocket = new serversocket(1234,100); system.out.println("waiting clients ..."); threads = new arraylist<gameserverthread>(); //receive request client while(true){ socket = serversocket.accept(); //create new thread once receive request new thread(new gameserverthread(socket, this)).start(); } }catch(ioexception e){ system.out.println("failed create socket!"); e.printstacktrace(); }finally{ try { serversocket.close(); } catch (ioexception e) { e.printstacktrace(); } } } public arraylist<gameserverthread> getallthreads(){ return this.threads; } public void addnewthread(gameserverthread t){ this.threads.add(t); }
serverthread:
private socket socket; private gameserver server; private outputstreamwriter writer; private bufferedreader reader; string username; public gameserverthread(socket s, gameserver srv) throws unsupportedencodingexception, ioexception{ system.out.println("succeeded connect 1 client!"); this.socket = s; this.server = srv; writer = new outputstreamwriter(this.socket.getoutputstream(), "utf-8"); reader = new bufferedreader(new inputstreamreader(this.socket.getinputstream(), "utf-8")); this.server.addnewthread(this); } public void run(){ try{ while(true){ receive(); } }catch(socketexception e){ e.printstacktrace(); }catch(ioexception e){ e.printstacktrace(); }finally{ try { this.socket.close(); } catch (ioexception e) { e.printstacktrace(); } } } private void receive() throws ioexception{ string str = null; while((str=reader.readline()) != null){ //once received message client, send other client. sendtoother(str); } } public void send(string msg){ try{ writer.write(msg); writer.write('\n'); writer.flush(); }catch(ioexception e){ e.printstacktrace(); } } private void sendtoother(string msg){ for(gameserverthread thread: this.server.getallthreads()){ if(!thread.equals(this)){ thread.send(msg); } } }
Comments
Post a Comment