2017-10-03 2 views
0

Ich arbeite an einer Client-Server-Java-Anwendung, mit Serialisierung und Deserialisierung. Zuerst möchte ich einfach ein serialisiertes Paket an den Server senden, der es deserialisiert und es auf dem Bildschirm druckt.Serialisierung und Deserialisierung - Socket Programmierung

Hier mi Auftraggeber:

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

} 

Und hier ist mein Server:

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

} 

Ich denke, dass mein Problem in der Deserialisierung ist, aber ich bin nicht in der Lage, es zu entdecken. Bitte helfen Sie mir

Das sind meine Fehler:

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

ich es mit meinen Fehler aktualisiert –

Antwort

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

Das Problem hier ist. Serialisierte Streams sind viel größer als das. Versuchen Sie 576.

Und achten Sie auch auf die Größe der ausgehenden Byte-Array. Wenn dies über 576 kommt, werden Sie in IP-Fragmentierung geraten, was zu einem Datagrammverlust führen wird, und Sie werden schließlich in die Pfad-MTU laufen, die im Allgemeinen nur 1250-1500 Bytes beträgt. Sie können also keine großen Objekte serialisieren.

auch:

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

sollte sein:

ByteArrayInputStream oSt = new ByteArrayInputStream(inUDP.getData(), inUDP.getOffset(), inUDP.getLength()); 
Verwandte Themen