Java tworzenie nowych bloków ObjectInputStream

Próbuję utworzyć nowy ObjectInputStream używając strumienia wejściowego pobranego z gniazda. Oto Mój kod:

To jest konstruktor dla mojej klasy MessageGetterSender. Program nie dociera do punktu kontrolnego 4.

public MessageGetterSender(Socket socket) {

    System.out.println("MessageGetterSender: Checkpoint 1");

    this.socket = socket;

    // Get input and output streams
    try {
        System.out.println("MessageGetterSender: Checkpoint 2");

        InputStream is = socket.getInputStream();

        System.out.println("MessageGetterSender: Checkpoint 3");

        this.in = new ObjectInputStream(is);

        System.out.println("MessageGetterSender: Checkpoint 4");

    } catch (IOException ioe) {
        System.out.println("Could not get ObjectInputStream on socket: " + socket.getLocalPort());
    }

    try {
        this.out = new ObjectOutputStream(socket.getOutputStream());
    } catch (IOException ioe) {
        System.out.println("Could not get ObjectOutputStream on socket: " + socket.getLocalPort());
    }

    System.out.println("MessageGetterSender: Checkpoint 5");
}

Uruchamiam nowy obiekt MessageGetterSender z klasy, w której podłączam się do serwera, aby uzyskać Gniazdo. Oto odpowiedni kod. Jest to Konstruktor InstantMessageClass, klasy, która tworzy instancje MessageGetterSender object:

public InstantMessageClient(String username) {

try {
    socket = new Socket("localhost", 5555);
} catch (IOException ioe) {
    System.out.println("Error: Could not connect to socket on port: " + serverPort);
}

messageGetterSender = new MessageGetterSender(socket);

...

Ponieważ kod nie jest wykonywany do Checkpoint 4, ale dociera do Checkpoint 3, jestem prawie pewien, że instancja ObjectInputStream jest winowajcą. Nie wiem dlaczego. Jakieś pomysły? Dzięki za pomoc.

Author: ericso, 2011-04-14

3 answers

Podczas konstruowania ObjectInputStream, w konstruktorze Klasa próbuje odczytać nagłówek, który napisał skojarzony ObjectOutputStream na drugim końcu połączenia. Nie powróci, dopóki nagłówek nie zostanie odczytany. Więc jeśli widzisz konstruktor "zawieszony", to dlatego, że druga strona gniazda albo nie użyła ObjectOutputStream, albo nie wyczyściła jeszcze danych.

 43
Author: MeBigFatGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-07 10:10:43

Aby rozwinąć odpowiedź FatGuy 'a dla innych Googlerów, którzy to znajdą; rozwiązaniem tego" problemu z kurczakiem i jajkiem " jest, aby każda strona najpierw otworzyła strumień wyjściowy, spłukała strumień wyjściowy, a następnie otworzyła strumień wejściowy.

ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.flush();
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
 44
Author: Haywood Slap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-28 15:56:22

Można również opóźnić inicjalizację strumienia ObjectInputStream, dopóki dane nie będą dostępne w strumieniu bazowym.

To podejście działa niezależnie od kolejności inicjalizacji strumienia i jest szczególnie przydatne, jeśli jeden koniec kanału znajduje się w kodzie biblioteki, którego nie można zmienić.

 1
Author: Mihai Danila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-27 19:53:37