2017-10-03 21 views
0

Je travaille sur une application Java serveur client, en utilisant la sérialisation et la désérialisation. Au début je veux simplement envoyer un paquet sérialisé au serveur qui le désérialise et l'imprime sur l'écran.Sérialisation et désérialisation - Programmation par socket

est ici mi client:

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

} 

Et voici mon serveur:

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

} 

Je pense que mon problème est dans la désérialisation mais je ne suis pas capable de le repérer. S'il vous plaît aidez-moi

Ce sont mes erreurs:

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

Je mis à jour avec mes erreurs –

Répondre

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

Le problème est ici. Les flux sérialisés sont beaucoup plus gros que cela. Essayez 576.

Et surveillez également la taille du tableau d'octets sortant. Si cela dépasse 576, vous allez rencontrer la fragmentation IP, qui commencera à causer une perte de datagramme, et vous finirez par courir dans le chemin MTU qui n'est généralement que de 1250-1500 octets. Vous ne pouvez donc pas sérialiser de gros objets.

aussi:

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

devrait être:

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