Adesso Java comincia a farmi arrabbiare... è forse bacata la classe ObjectInputStream? Non è possibile che del codice identico funzioni 3 volte sì e una no...
codice:
import java.io.*;
import java.net.*;
import java.util.Vector;
public class Server extends Thread {
private class GestioneClient extends Thread {
private ObjectInputStream ois = null;
private ObjectOutputStream oos = null;
private Messaggio msg;
private int id;
public GestioneClient(InputStream is, OutputStream os, int id) throws Exception {
this.id = id;
ois = new ObjectInputStream(is);
oos = new ObjectOutputStream(os);
System.out.println("Costruttore");
}
public void run() {
try {
while (true) {
msg = (Messaggio) ois.readObject();
processaMessaggio(msg);
}
} catch (Exception e) { e.printStackTrace(); }
}
public void inviaMessaggio(Messaggio msg) throws Exception {
oos.writeObject(msg);
oos.flush();
}
private void processaMessaggio(Messaggio msg) {
Vector v = msg.getMessaggio();
for (int i=0; i<v.size(); i++) System.out.println( v.elementAt(i) );
}
}
private ServerSocket server;
private InputStream is;
private OutputStream os;
private Vector clients;
private Vector connessioni;
private boolean attivo;
private int id;
public Server() {
clients = new Vector();
connessioni = new Vector();
attivo = true;
}
public void run() {
try {
server = new ServerSocket(2525);
while (attivo) {
Socket c = server.accept();
System.out.println("Arrivata connessione numero " + clients.size() + 1);
is = c.getInputStream();
os = c.getOutputStream();
id = clients.size();
clients.add( new GestioneClient(is, os, id) );
System.out.println("PASSO SUCCESSIVO");
((GestioneClient) clients.elementAt(clients.size()-1)).start();
connessioni.add( new String("Connessione " + (connessioni.size() + 1) + "!") );
Messaggio msg = new Messaggio( (Vector) connessioni.clone() );
inviaNuovoVettore(msg);
}
} catch (Exception e) { e.printStackTrace(); }
}
private void inviaNuovoVettore(Messaggio m) {
try {
for (int i=0; i<clients.size(); i++) {
((GestioneClient) clients.elementAt(i)).inviaMessaggio(m);
}
} catch (Exception e) { e.printStackTrace(); }
}
public static void main(String [] args) {
Server s = new Server();
s.start();
}
}
Se tolgo le linee in grassetto tutto funziona perfettamente, se le lascio non compare mai la scritta "PASSO SUCCESSIVO"...
Qualcuno ha una vaga idea del perchè?
N.B.: Ho scritto una chat con del codice praticamente identico... la chat funziona perfettamente!!!
P.S.: Tralasciate il fatto che il messaggio sia costituito da un Vector... mi serviva solo per fare dei test.
Ciao.