Dariusz
Grębowiec
Student,
Politechnika
Świętokrzyska w
Kielcach
Temat: strumienie, wątki i gniazda - problem
Witam wszystkich :)Mam problem ze strumieniem wejściowym podczas odbierania obiektu po stronie klienta (aplikacja klient-serwer), a dokładniej wywala mi taki błąd:
java.io.StreamCorruptedException: invalid stream header: 7371007E
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at klient.Polaczenie.run(Polaczenie.java:69)
at java.lang.Thread.run(Thread.java:619)
Poniżej zamieszczam fragmenty kodu, najpierw chciałbym dodać że problem dotyczy metody run() w klasie Polaczenie, oraz być może metody wyslijListeGraczy(int) w klasie PolaczenieSerwer
kod klasy Połączenie z pakietu klient:
public class Polaczenie implements Runnable {
private Socket klient = null;
private ObjectOutputStream wy;
private ObjectInputStream we;
private Paczka paczkaWe;
private ListaGraczy listaGraczy;
private Thread aktualizujListeThread = new Thread(this);
private HashMap<Integer, String> gracze = new HashMap<Integer, String>();
private String nick;
private String adres;
// SocketAddress socketAddress;
public Polaczenie(String nick, String adres, ListaGraczy listaGraczy)
throws UnknownHostException {
this.nick = nick;
this.adres = adres;
try {
klient = new Socket(adres, 4440);
} catch (IOException e) {
e.printStackTrace();
}
polacz();
this.listaGraczy = listaGraczy;
}
private void polacz() {
try {
wy = new ObjectOutputStream(klient.getOutputStream());
wy.writeObject(new Paczka(nick, adres));
wy.flush();
aktualizujListeThread.start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Problem z połączeniem...",
"BŁĄD SERWERA", JOptionPane.ERROR_MESSAGE);
}
}
public/* synchronized */void run() {
try {
while (true) {
//-------error---------------------
we = new ObjectInputStream(klient.getInputStream()); // linia nr 69
paczkaWe = (Paczka) we.readObject();
gracze = paczkaWe.getGracze();
System.out.println("aktualizaja listy graczy . . ." + gracze);
listaGraczy.dodajGracza(gracze);
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
oraz fragment klasy działającej po stronie serwera:
public PolaczenieSerwer(int nrPortu) {
this.nrPortu = nrPortu;
try {
serwer = new ServerSocket(nrPortu);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("oczekiwanie...");
while (true) {
podlaczGracza();
wyslijListeGraczy(/* gracze, */nrGracza);
nrGracza++;
}
}
void podlaczGracza() {
try {
klient = serwer.accept();
we = new ObjectInputStream(klient.getInputStream());
paczkaWe = (Paczka) we.readObject();
nick = paczkaWe.getNick();
gracze.put(nrGracza, nick);
System.out.println("dodano gracza: " + nick + ", nr: " + nrGracza);
graczeSocket.add(klient);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
void wyslijListeGraczy(/* Gracze gracze, */int nrGracza) {
try {
graczeWy.add(new ObjectOutputStream(graczeSocket.get(nrGracza)
.getOutputStream()));
li = graczeWy.listIterator();
while (li.hasNext()) {
wy = li.next();
try {
wy.writeObject(new Paczka(gracze));
wy.flush();
System.out.println("*" + gracze);
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mam nadzieję, że nikogo nie zniechęci długość wątku:)
wszelkie wskazówki będą mile widziane;]Dariusz Grębowiec edytował(a) ten post dnia 07.02.10 o godzinie 17:21