EOFException при отправке ObjectOutputStream

Я пытаюсь отправить пустой TCP-пакет на сервер, работающий на порту 80, однако он дает мне исключение EOFException, когда сервер отвечает.

java.io.EOFException в java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2624) в java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3099) в java.io.ObjectInputStream.readStreamHeader(ObjectInputStream. java:853) в java.io.ObjectInputStream.(ObjectInputStream.java:349) в me.adamstephenson.test.main.main(main.java:106)

ArrayList<String> results = getIPs();

    for (String ip : results){
        System.out.println(ip);

        String pingip = ip;
        pingip = pingip.replaceAll("[^\\d.]", "");
        System.out.println(pingip);

        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        try {
            socket = new Socket(pingip, 80);
            oos = new ObjectOutputStream(socket.getOutputStream());

            ois = new ObjectInputStream(socket.getInputStream());  // error here

            String msg = "blank";
            oos.write(msg.getBytes());
            oos.flush();

            //read the server response message
            String message = (String) ois.readObject();

            System.out.println(message);

            ois.close();
            oos.close();
            socket.close();
        } catch (ConnectException | EOFException e) {
            System.out.println("Failed to connect to: "+pingip);
            e.printStackTrace();
        }


    }

Означает ли исключение EOFException, что ответ был пустым?


person Adam    schedule 03.05.2017    source источник
comment
нет, это означает, что другая сторона закрыла сокет, прежде чем что-либо писать. Вероятно, сервер где-то выдал исключение, возможно, пытаясь прочитать запрос. Есть подозрение, что этот код просто записывает в поток пустые байты. Как сервер узнает, сколько данных нужно прочитать?   -  person MeBigFatGuy    schedule 03.05.2017
comment
Пробовали ли вы ois.readByte() вместо ois.readObject()?. Потому что метод readObject() возвращает десериализованный объект, который присутствует на другой стороне. Но вы пишете массив байтов.   -  person akhil Rao    schedule 03.05.2017
comment
Да, только что попробовал readByte, та же проблема. Собираюсь переделывать сервер.   -  person Adam    schedule 03.05.2017


Ответы (1)


Это означает, что сервер даже не создал ObjectOutputStream перед закрытием сокета. Вероятно, вы отправили ему что-то, чего он не понял, и, возможно, протокол приложения, который он использует, вообще не включает сериализацию.

В конце концов, порт 80 зарезервирован для HTTP.

person user207421    schedule 03.05.2017