readObject() problem

0

Mam problem z serwerem - napisałem klienta i serwer które łączą się za
pomocą strumieni ObjectInput / Output stream. komunikacja jest poprzez
zserializowany obiekt msg.
Problem jest następujący jak chce uruchomić komunikacje to nie tworzą
się te strumienie a np. gdy zakomentuje tworzenie jednego ze strumieni
na serwerze to jest wszystko OK.

dlaczego tak jest?
poniżej wkleje źródła:

Serwer

import java.io.;
import java.net.
;
import java.io.Serializable;
import java.lang.Thread.*;

public class serwer extends Thread {
ObjectOutputStream wyjscie;
Socket gniazdo;
ObjectInputStream wejscie;

public serwer() throws IOException {

}

     public void run() {

try {
ServerSocket server = new ServerSocket(4747);
System.out.println("This server runs on port " +
server.getLocalPort());
gniazdo = server.accept();
System.out.println("Zaakceptowano polaczenie");
wejscie = new ObjectInputStream(gniazdo.getInputStream());
wyjscie = new ObjectOutputStream(gniazdo.getOutputStream());
System.out.println("Utworzono strumienie");

// wyjscie.writeUTF("Wysy");
//wyjscie.writeInt(11);

    Message msg = new Message("toja");

    System.out.println(msg.msg);
    synchronized(wyjscie){

wyjscie.writeInt(1);
wyjscie.flush();
wyjscie.writeObject(msg);
wyjscie.flush();
wyjscie.writeInt(0);
wyjscie.flush();

    System.out.println(" Odczytana liczba to:

"+wejscie.readInt());
try{

    Thread.sleep(3000);

}

catch(Exception e){}
}

// Główna pętla odbierająca
while (true) {

}
} catch (IOException ex) {

System.err.println(ex);

}
}

public static void main(String[] args) {
try {
Thread t = new serwer();
t.start();
} catch (IOException e) {

e.printStackTrace();

}
}
}

klient:

import java.net.;
import java.io.
;
import java.io.Serializable;
import java.lang.Thread.*;

public class klient {

public static void main(String[] args) {

    Socket gniazdo;

String hostname = "localhost";
ObjectInputStream wejscie;
ObjectOutputStream wyjscie;
try {
gniazdo = new Socket(hostname, 4747);
wejscie = new ObjectInputStream(gniazdo.getInputStream());
wyjscie = new ObjectOutputStream(gniazdo.getOutputStream());

while (true){
synchronized(wejscie){

int liczba = wejscie.readInt();
System.out.println(liczba);
switch(liczba){
case 0:
continue;
case 1:

try {
Message msg = (Message) wejscie.readObject();
String wiad = msg.msg;
System.out.println(wiad);
msg = null;
liczba = 0;
wyjscie.writeInt(5);
wyjscie.flush();
break;
}

catch (Exception e) {}

}
}//end of synchronized
}}// end try

catch (UnknownHostException ex) {
System.err.println(ex);
} catch (IOException ex) {

System.err.println(ex);

}
}
}

klasa Message msg:

import java.io.*;

class Message implements Serializable {

String nadawca;
String odbiorca;
String msg;

public Message(String msg){
super();
this.msg = msg;

}
}

--
pencom

0

tyle razy juz o tym wspominalem....
zamien kolejnosc tworzenia strumieni w jednej z klas

pozdrawiam

0

Dziekuje za pomoc :) zaraz sprawdzę, a ja z miesiąc siedziałem nad tym i nic a powód był taki prosty. hehehe

0

@Eximus - moglbys rozwinac ten temat troche albo podac linka jakiegos? co to znaczy zmienic kolejnosc tworznia strumieni?

pozdrawiam

0

gość na przykładzie serwera -

w klasie serwer inicjujemy streamy :

ObjectOutputStream wyjscie; <-- strumień wyjściowy
Socket gniazdo;
ObjectInputStream wejscie; <-- strumień wejściowy

I po prostu je zamieniamy kolejnościa na serwerze, to samo robimy z zamianą przypisania strumieni czyli ogólnie muszą być odwrotnie inicjalizowane niż na kliencie.

Oto poprawiony listing programu:

Serwer

import java.io.;
import java.net.
;
import java.io.Serializable;
import java.lang.Thread.*;

public class serwer extends Thread {

ObjectInputStream wejscie;
ObjectOutputStream wyjscie;
Socket gniazdo;

public serwer() throws IOException {

}

     public void run() {

try {
ServerSocket server = new ServerSocket(4747);
System.out.println("This server runs on port " +
server.getLocalPort());
gniazdo = server.accept();
System.out.println("Zaakceptowano polaczenie");

wyjscie = new ObjectOutputStream(gniazdo.getOutputStream());
wejscie = new ObjectInputStream(gniazdo.getInputStream());

System.out.println("Utworzono strumienie");

// wyjscie.writeUTF("Wysy");
//wyjscie.writeInt(11);

    Message msg = new Message("toja");

    System.out.println(msg.msg);
    synchronized(wyjscie){

wyjscie.writeInt(1);
wyjscie.flush();
wyjscie.writeObject(msg);
wyjscie.flush();
wyjscie.writeInt(0);
wyjscie.flush();

    System.out.println(" Odczytana liczba to:

"+wejscie.readInt());
try{

    Thread.sleep(3000);

}

catch(Exception e){}
}

// Główna pętla odbierająca
while (true) {

}
} catch (IOException ex) {

System.err.println(ex);

}
}

public static void main(String[] args) {
try {
Thread t = new serwer();
t.start();
} catch (IOException e) {

e.printStackTrace();

}
}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1