2017-10-03 30 views
0

私はクライアントサーバーのJavaアプリケーションで、シリアル化と逆シリアル化を使用して作業しています。最初は、シリアライズされたパケットをサーバに送信して、それを逆シリアル化して画面に表示するだけです。ここでシリアル化と逆シリアル化 - ソケットプログラミング

はMIクライアントである:

public class Client { 

    public static void main(String[] args) throws IOException { 

     int portUDP = Integer.parseInt("6004"); 
     InetAddress host = InetAddress.getByName("127.0.0.1"); 

     DatagramSocket UDPsock = new DatagramSocket(); 

     ByteArrayOutputStream oSt = new ByteArrayOutputStream(); 
     ObjectOutputStream ooSt = new ObjectOutputStream(oSt); 

     packet pck = new packet(2,1,3,"try"); 

     ooSt.writeObject(pck); 
     ooSt.flush(); 

     byte[] sendBuf = new byte[30]; 
     sendBuf = oSt.toByteArray(); 

     DatagramPacket payload = new DatagramPacket(sendBuf, sendBuf.length, host, portUDP); 
     UDPsock.send(payload); 


     UDPsock.close(); 
    } 

} 

そして、ここでは私のサーバーです:

public class Server { 

    public static void main(String[] args) throws IOException, ClassNotFoundException { 

     int portUDP = 6004; 

     DatagramSocket UDPsock = new DatagramSocket(portUDP); 

     byte[] payload = new byte[30]; 
     DatagramPacket inUDP = new DatagramPacket(payload, payload.length); 

     UDPsock.receive(inUDP); 

     ByteArrayInputStream oSt = new ByteArrayInputStream(inUDP.getData()); 
     ObjectInputStream ooSt = new ObjectInputStream(oSt); 

     packet pck = (packet)ooSt.readObject(); 

     pck.printContents(); 

     UDPsock.close(); 
    } 

} 

私は私の問題は、逆シリアル化であると思いますが、私はそれを見つけることができませんしています。問題はここにある

Exception in thread "main" java.io.EOFException 
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2353) 
    at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3092) 
    at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2892) 
    at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1075) 
    at java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:717) 
    at java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:833) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1609) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) 
    at Server.main(Server.java:23) 
+0

私は私のエラーでそれを更新します –

答えて

2
byte[] payload = new byte[30]; 

:これは私のエラーでくれ

を助けてください。シリアライズされたストリームはこれよりはるかに大きくなります。 576を試してください。

発信バイト配列のサイズも監視してください。これが576以上になると、IP断片化が発生し、データグラムの損失が発生し、最終的にパスMTU(一般に1250-1500バイトのみ)が実行されます。したがって、大きなオブジェクトをシリアル化することはできません。また

ByteArrayInputStream oSt = new ByteArrayInputStream(inUDP.getData()); 

は次のようになります。

ByteArrayInputStream oSt = new ByteArrayInputStream(inUDP.getData(), inUDP.getOffset(), inUDP.getLength()); 
関連する問題