Java – send and receive serialized objects over UDP

I tried to send a serialized object from the server process to the client process in Java using UDP The problem is that the method the client is receiving is blocked Can I help you?

Here is the server code of the sending object:

ClientModel C1= new ClientModel(100,"Noor",38,"asd");
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  ObjectOutputStream oos = new ObjectOutputStream(baos);
  oos.writeObject(C1);
  oos.flush();
  byte[] Buf= baos.toByteArray();
  packet = new DatagramPacket(Buf,Buf.length,client,port);
  socket.send(packet);

Here is the client code of the receiving object:

byte[] buffer = new byte[100000];
packet = new DatagramPacket(buffer,buffer.length );
socket.receive(packet);
System.out.println("packet received");

I just want to receive the reconstructed object, but I can't receive the packet itself

Solution

I don't know what you want to accomplish, but using UDP is not so easy... The main reason is that in the description of datagram packet object:

A good tutorial for using UDP is http://download.oracle.com/javase/tutorial/networking/datagrams/clientServer.html

About your blockade:

I didn't really test it, but I'm pretty sure - based on the description - datagram socket The reseive function will block until the packet is filled (in your case, until 100000 bytes are received)

I suggest you start with a data transmitter with a fixed known length, and you can transfer the size of the actual payload It's like:

public static void main(String[] args) {
    ClientModel c1 = new ClientModel ();
    c1.data = 123;
    c1.name = "test";

    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ObjectOutputStream oos = new ObjectOutputStream(baos);
      oos.writeObject(c1);
      oos.flush();
      // get the byte array of the object
      byte[] Buf= baos.toByteArray();

      int number = Buf.length;;
      byte[] data = new byte[4];

      // int -> byte[]
      for (int i = 0; i < 4; ++i) {
          int shift = i << 3; // i * 8
          data[3-i] = (byte)((number & (0xff << shift)) >>> shift);
      }

      DatagramSocket socket = new DatagramSocket(1233);
      InetAddress client = InetAddress.getByName("localhost");
      DatagramPacket packet = new DatagramPacket(data,4,1234);
      socket.send(packet);

      // Now send the payload
      packet = new DatagramPacket(Buf,1234);
      socket.send(packet);

      System.out.println("DONE SENDING");
    } catch(Exception e) {
        e.printStackTrace();
    }
}

On the other side, you now know your size:

public static void main(String[] args) {
    try {
      DatagramSocket socket = new DatagramSocket(1234);

      byte[] data = new byte[4];
      DatagramPacket packet = new DatagramPacket(data,data.length );
      socket.receive(packet);

      int len = 0;
      // byte[] -> int
      for (int i = 0; i < 4; ++i) {
          len |= (data[3-i] & 0xff) << (i << 3);
      }

      // Now we kNow the length of the payload
      byte[] buffer = new byte[len];
      packet = new DatagramPacket(buffer,buffer.length );
      socket.receive(packet);

        ByteArrayInputStream baos = new ByteArrayInputStream(buffer);
      ObjectInputStream oos = new ObjectInputStream(baos);
      ClientModel c1 = (ClientModel)oos.readObject();
      c1.print();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

Cientmodel clas uses:

public class ClientModel implements Serializable{
    private static final long serialVersionUID = -4507489610617393544L;

    String name = "";
    int data = 1;

    void print() {
        System.out.println(data +": " + name);
    }
}

I tested this code and it works well Hope to help (I'm from http://www.tutorials.de/java/228129-konvertierung-von-integer-byte-array.html Start getting bytes to int and around)

Edit: as mentioned in the note, it is usually a very bad idea to mainly use UDP, because you don't know that your packets are received in the correct order, or even all UDP is not guaranteed I haven't done much UDP programming, but the only thing I can rely on (if I understand correctly) is that if you receive a packet, it matches the datagram (65527 bytes - see https://en.wikipedia.org/wiki/User_Datagram_Protocol ), it will contain the whole thing So if you don't care about the order of messages and your objects fit into datagrams, you should be fine

Edit 2: Code: do not use it This is just an example. Ind UDP you should have only one type of packet, and the data has a known size So you don't have to send "size" If you use the code shown above and discard a packet, the next packet will be the wrong size (that is, the first packet is discarded, and suddenly you will check the first byte of the payload for size)

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>