java - Cannot get elements from Vector from other class (Thread) -
i have class (my server start class), here create every new client new thread him. after thread createt, add him vector (list) keep track of active users , connections, can send messages specific user. cant access vector-list thread (its class below). can explain me, how can this? have private list , public setter , getter methods size 1 vector. testet it, if connect more 1 client there multiple threads different socket creates. can add entrys vector if manuel in server start class.
package securemessageserver; public class securemessageserver { private vector<securemessageserverclientthread> userlist = new vector(); private sslserversocket sslserversocket; int port = 9999; private boolean isrunning=true; sslsocket sslsocket; private synchronized void loadcertificat(){ try { url url = this.getclass().getresource("/securemessageserver/keystore.jks"); file file = new file(url.touri()); system.setproperty("javax.net.ssl.keystore", "c:/keystore.jks"); system.setproperty("javax.net.ssl.keystorepassword", "schelkan1994"); //system.setproperty("javax.net.debug","all"); system.out.println("certifikat geladen"); } catch (urisyntaxexception ex) { logger.getlogger(securemessageserver.class.getname()).log(level.severe, null, ex);; stopserver(); } } private synchronized void createsocket(){ try { sslserversocketfactory sslserversocketfactory = (sslserversocketfactory) sslserversocketfactory.getdefault(); sslserversocket = (sslserversocket) sslserversocketfactory.createserversocket(port); system.out.println("socket erstellt mit "+port); } catch (ioexception ex) { logger.getlogger(securemessageserver.class.getname()).log(level.severe, null, ex); stopserver(); } } private synchronized void startserver(sslserversocket sslserversocket){ while(isrunning){ try { system.out.println("akzeptiere verbindungen"); sslsocket = (sslsocket) sslserversocket.accept(); securemessageserverclientthread client = new securemessageserverclientthread(sslsocket); startnewclient(client); userlist.add(client); } catch (ioexception ex) { logger.getlogger(securemessageserver.class.getname()).log(level.severe, null, ex); stopserver(); } } } public synchronized void startnewclient(securemessageserverclientthread th){ new thread(th).start(); } public synchronized void stopserver(){ isrunning=false; } public synchronized sslserversocket getserversocket(){ if(sslserversocket!=null){ return this.sslserversocket; } return null; } public synchronized void addthreadtolist(securemessageserverclientthread thread){ userlist.add(thread); } public synchronized void getallthreadfromlist(){ system.out.println("size: "+userlist.size()); } public synchronized string getusername(){ return userlist.get(0).getuserofthread(); } public synchronized void deletethreadfromlist(securemessageserverclientthread thread){ userlist.remove(thread); } public synchronized void getusernameofallthreads(){ for(int i=0;userlist.size()>i;i++){ system.out.println(userlist.get(i).getuserofthread()); } } public static void main(string[] args){ securemessageserver server = new securemessageserver(); server.loadcertificat(); server.createsocket(); server.startserver(server.sslserversocket); }
}
and hier ist other class (my thread class) instanze of class if createt if new client connect keep track of connection , perform input , output operations. dont right value vector in other class ... see error? help
public class securemessageserverclientthread implements runnable{ private sslsocket socket; private string username; boolean isrunning=true; securemessageserver server = new securemessageserver(); public securemessageserverclientthread(sslsocket socket){ this.socket=socket; } private objectinputstream sinput; private objectoutputstream soutput; @override public void run() { system.out.println("client mit socket running: "+socket); while(isrunning){ try { sinput = new objectinputstream(socket.getinputstream()); securemessageserverclientmessage msg = (securemessageserverclientmessage) sinput.readobject(); if(msg.gettype()==0){ system.out.println("all threads:"); server.getallthreadfromlist(); }else if(msg.gettype()==1){ system.out.println(msg.getmessage()); }else if(msg.gettype()==2){ thread.sleep(1000); socket.close(); this.stopthread(); }else{ system.out.println("unbekannter nachrichtentyp"); } } catch (ioexception ex) { logger.getlogger(securemessageserverclientthread.class.getname()).log(level.severe, null, ex); } catch (classnotfoundexception ex) { logger.getlogger(securemessageserverclientthread.class.getname()).log(level.severe, null, ex); } catch (interruptedexception ex) { logger.getlogger(securemessageserverclientthread.class.getname()).log(level.severe, null, ex); } } } public void stopthread(){ isrunning=false; // soutput = new objectoutputstream(socket.getoutputstream()); } public string getuserofthread(){ return this.username; } public void getuserlist(){ server.getallthreadfromlist(); }
}
in securemessageserverclientthread
, create new server instance securemessageserver server = new securemessageserver();
.
this means when call server.getallthreadfromlist()
in getuserlist
, you're getting list server created has no clients.
the client thread should instead take server instance parameter:
securemessageserver server; public securemessageserverclientthread(sslsocket socket, securemessageserver server){ this.socket=socket; this.server=server; }
and in server, should pass this
new client instance:
securemessageserverclientthread client = new securemessageserverclientthread(sslsocket, this);
Comments
Post a Comment