Salve a tutti.. avrei un problema con la gestione di una socket.
Ho un server che accetta delle connessioni sulla sua serversocket e poi a seconda del client connesso, lancia due diversi tipi di Thread, a seconda che il client sia semplice o CLientAmministratore.
codice:
Socket s = ss.accept();
System.out.println(" Ho eseguito la accept");
BufferedReader br =new BufferedReader(newInputStreamReader(s.getInputStream()));
String user = br.readLine();
if(user.equals("administrator")){
GestoreAdmin ga=new GestoreAdmin(s,list);
ga.start();
}else{
GestoreClient g = new GestoreClient(list,s,user);
g.start();
}
ok... quindi come si vede, nel GestoreAdmin io passo anche il riferimento alla socket s.
ora questo gestore riceve dei messaggi da un eventuale client amministratore al quale poi dovrà rispondere.
La mia idea è quella che, dopo che il Server risponde al clientAmministratore, la connessione dovrebbe rimanere aperta per altri scambi di messaggi, ma questo non avviene.
ecco la parte di codice incriminata:
codice:
try{
socketcopy=socket;
in=new BufferedReader(new InputStreamReader(socketcopy.getInputStream()));
String msg=null;
while((msg=in.readLine())!=null){
out=new PrintWriter(socketcopy.getOutputStream());
if(msg.equals("esegui")){
Iterator<Struttura> it = list.Iterator();
int i=1;
while(it.hasNext()){
Struttura temp=it.next();
out.println(temp.getUser());
out.flush();
i++;
}
out.close(); <----
}catch bla bla
ora il mio problema tecnico è questo:
mantendo l'out.close(), chiudo il buffer di scrittura e di conseguenza la socket, questo è quello ke mi torna su consolle:
codice:
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at server.GestoreAdmin.run(Server.java:91)
se invece tolgo l'operazione out.close(), non so perchè ma il clientAmministratore rimane fermo sulla readLine(); come se il server senza quell'istruzione non svuotasse il buffer, o addirittura non finisse di inviare i messaggi..
sto impazzendo
qualcuno puo aiutarmi? grazie