문제

I'm trying to send a HashMap from a client process to a server process using a DatagramSocket, but I'm getting a ObjectInputStream.readObject() EOFException. I found lots of references to other people having this problem, but I'm having a hard time figuring out which solutions apply to me. Here is my code...

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;
  }

Here is the stack trace...

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)
도움이 되었습니까?

해결책

Take a look at DataPacket javadoc: http://docs.oracle.com/javase/7/docs/api/java/net/DatagramPacket.html#getData()

And pay attention to offset and length

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top