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

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -