MultiThreading, Java Server/Client Project -
hi i'm working on server/ client program in java, client connects server , sends number server, server adds number global variable , returns global variable. problem having when have multiple clients 1 client doesn't work while other does, client created @ later stage works. have created separate threads each client , , works degree.
this snippet of server class creates new thread
public static integer globalsum = 0; public static void main(string[] args) throws ioexception { serversocket server = new serversocket(8888); socket s; system.out.println("server running. waiting client connect..."); while(true) { s = server.accept(); threadhandler th=new threadhandler(s); thread t=new thread(th); t.start(); system.out.println("client connected"); } }
here client class
public class client2 { public static void main(string[] args) throws ioexception { socket s = new socket("localhost", 8888); inputstream instream = s.getinputstream(); outputstream outstream = s.getoutputstream(); scanner in = new scanner(instream); scanner input= new scanner(system.in); printwriter out = new printwriter(outstream); for(int i=0;i<5;i++){ system.out.println("please enter value "+(i+1)); string response=input.nextline(); string request="submit"+" "+response+"\n"; out.print(request); out.flush(); system.out.println(in.nextline()); } out.print("quit\n"); out.flush(); s.close(); } }
and here threadhandler class
import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.serversocket; import java.net.socket; import java.util.arraylist; import java.util.scanner; public class threadhandler implements runnable { private socket s; private scanner in; private static printwriter out; servermultipleclients serverinstance; public threadhandler(socket s) { //this.serverinstance=serverinstance; this.s=s; } public void run() { try { try { in = new scanner(s.getinputstream()); out = new printwriter(s.getoutputstream()); doservice(); // actual service } { s.close(); } } catch (ioexception e) { system.err.println(e); } return; } public void doservice() throws ioexception{ string request; while(true){ request=in.next(); string arraystring[] = request.split("\\s+") ; if(request.equals("submit")){ string value2=in.next(); handle(value2); } else if (request.equals("quit")){ break; } else if(!request.equals("submit")||!request.equals("quit")){ system.out.println("error in input"); break; } } } public void handle(string value1){ if(isint(value1)==true){ int valueint=integer.parseint(value1); synchronized(serverinstance.globalsum) { if((valueint+serverinstance.globalsum)<integer.max_value){ servermultipleclients.globalsum=servermultipleclients.globalsum+valueint; out.println("ok"); out.flush(); system.out.println("new value global sum is: "+servermultipleclients.globalsum); } else if((valueint+servermultipleclients.globalsum)>=integer.max_value){ out.println("error"); system.out.println("global sum unchanged, value is: "+servermultipleclients.globalsum); } else{ out.println("error"); system.out.println("global sum unchanged, value is: "+servermultipleclients.globalsum); } } } } public boolean isint( string input ) { try { integer.parseint( input ); return true; } catch( exception e ) { return false; } } }
the problem when run this, works each client run @ later stage previous client, going previous client means that client crashes.
are sure thing:
private static printwriter out;
must static? means threads share output stream!
Comments
Post a Comment