2013-10-25 46 views
1

我想從客戶端進程發送一個HashMap到服務器進程使用DatagramSocket,但我得到一個ObjectInputStream.readObject() EOFException。我發現很多人提到有這個問題的其他人,但我很難找出哪些解決方案適用於我。這裏是我的代碼...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) 

回答

相關問題