Java ObjectInputStream висит - PullRequest
       7

Java ObjectInputStream висит

6 голосов
/ 01 октября 2011

Я чувствую себя действительно глупо сейчас, ребята ... в основном я подключаюсь через TCP на локальной машине ... и когда я пытаюсь сделать потоки In / Out на клиенте, он не будет пропущен при создании объекта вводапоток.Что дает?Это останавливается после печати 2 ... никаких исключений или чего-то еще ... Это не первый раз, когда я использую этот класс, отчасти поэтому я озадачен.

try {
            System.out.println("1");
            mySocket = new Socket("localhost", 11311);
            System.out.println("12");
            oos = new ObjectOutputStream(mySocket.getOutputStream());
            System.out.println("2");
            ois = new ObjectInputStream(mySocket.getInputStream());
            System.out.println("13");

        } catch (Exception e) {
            e.printStackTrace();
        }

Ответы [ 2 ]

6 голосов
/ 01 октября 2011

Из спецификации ObjectInputStream:

Этот конструктор будет блокироваться до соответствующего ObjectOutputStream написал и очистил заголовок.

1 голос
/ 06 июля 2013

(для будущих читателей :) У меня была такая же проблема, потому что я сделал глупое изменение в серверной программе и долгое время не проверял ее, тогда я был озадачен, почему программа заблокирована.

ServerSocket принимает соединение (responderSocket = serverSock.accept();), а затем неожиданно для неподходящей if (глупое изменение, о котором я говорил!) Выпрыгивает из потока, и потому что я не добавил finallyблок для закрытия потоков и сокетов сокет был оставлен без отправки или получения чего-либо (даже заголовков потока).Поэтому в клиентской программе не было заголовка потока (когда я отлаживал код, который я видел, что последняя функция, выполненная перед блокировкой, была:

public ObjectInputStream(InputStream in) throws IOException {
    verifySubclass();
    bin = new BlockDataInputStream(in);
    handles = new HandleTable(10);
    vlist = new ValidationList();
    enableOverride = false;
    readStreamHeader();                  //// <== This function
    bin.setBlockDataMode(true);
}

readStreamHeader();)

Так что будьте осторожны счто происходит на стороне сервера, возможно, проблема не в том, что вы ожидаете!

...