ObjectInputStream.readObject() EOFException

Я пытаюсь отправить HashMap из клиентского процесса в серверный процесс с помощью DatagramSocket, но получаю ошибку ObjectInputStream.readObject() EOFException. Я нашел много ссылок на других людей, столкнувшихся с этой проблемой, но мне трудно понять, какие решения применимы ко мне. Вот мой код...

protected static void sendMsgMap(DatagramSocket sendSocket,
                                 DatagramPacket sendPacket,
                                 HashMap<Integer, Boolean> message,
                                 InetAddress address, int port) {
    clearBuffer(sendPacket.getData());
    sendPacket.setAddress(address);
    sendPacket.setPort(port);
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    ObjectOutput outStream = null;
    try {
      outStream = new ObjectOutputStream(byteStream);   
      outStream.writeObject(message);
      outStream.flush();
      outStream.close();
      sendPacket.setData(byteStream.toByteArray());
      sendSocket.send(sendPacket);
    } catch (IOException exception) {
      exception.printStackTrace();
    }
  }

  @SuppressWarnings("unchecked")
  protected static HashMap<Integer, Boolean> receiveMsgMap(DatagramSocket receiveSocket,
                                             DatagramPacket receivePacket) throws SocketTimeoutException {
    HashMap<Integer, Boolean> ret = new HashMap<Integer, Boolean>();
    clearBuffer(receivePacket.getData());
    try {
      receiveSocket.receive(receivePacket);
      ByteArrayInputStream byteStream = new ByteArrayInputStream(receivePacket.getData());
      ObjectInput inStream = new ObjectInputStream(byteStream);
      /* EXCEPTION OCCURS AT LINE BELOW */
      ret = (HashMap<Integer, Boolean>)inStream.readObject();
    } catch (SocketTimeoutException exception) {
      throw exception;
    } catch (IOException | ClassNotFoundException exception) {
      exception.printStackTrace();
    }

    return ret;
  }

Вот трассировка стека...

java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2323)
    at java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2816)
    at java.io.ObjectInputStream.readHandle(ObjectInputStream.java:1450)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at java.util.HashMap.readObject(HashMap.java:1155)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1891)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at info.danforbes.cs370.UDPUtils.receiveMsgMap(UDPUtils.java:94)
    at info.danforbes.cs370.ReliableUDPServer$ServerThread.listen(ReliableUDPServer.java:27)
    at info.danforbes.cs370.UDPServer$ServerThread.run(UDPServer.java:191)
    at info.danforbes.cs370.UDPServer.run(UDPServer.java:106)
    at info.danforbes.cs370.ReliableUDPServer.main(ReliableUDPServer.java:45)

person Dan Forbes    schedule 25.10.2013    source источник


Ответы (1)


Взгляните на javadoc DataPacket: http://docs.oracle.com/javase/7/docs/api/java/net/DatagramPacket.html#getData()

И обратите внимание на смещение и длину

person iluxa    schedule 25.10.2013
comment
Да, это была проблема. Буфер принимаемого пакета был недостаточно большим (1024) для хранения представления массива байтов отправляемого HashMap (~16 000). Спасибо! - person Dan Forbes; 25.10.2013
comment
О боже, да вы только что спасли мне жизнь! Не проверял размер буфера, и я застрял на несколько часов. - person Kent; 22.02.2015