Serialization 数据包的序列化

Serialization 数据包的序列化,serialization,Serialization,我想知道,如何序列化DatagramPacket。。。在我的代码中,我有两个通过服务器进行交互的客户机。client1将client2Packet放入serverPacket并发送给服务器,服务器提取client2Packet并发送给client2。一些关于VPN的模拟,但我一直面临java.io.NotSerializableException,我创建了一个实现接口可序列化的类,但仍然,请帮助我:首先我想知道这是否可能,如果可能,请告诉我如何,谢谢,我把我的代码放在下面:` `在这里输入代码

我想知道,如何序列化DatagramPacket。。。在我的代码中,我有两个通过服务器进行交互的客户机。client1将client2Packet放入serverPacket并发送给服务器,服务器提取client2Packet并发送给client2。一些关于VPN的模拟,但我一直面临java.io.NotSerializableException,我创建了一个实现接口可序列化的类,但仍然,请帮助我:首先我想知道这是否可能,如果可能,请告诉我如何,谢谢,我把我的代码放在下面:`

`在这里输入代码

package puya

`import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

public class Client1 {
    public static int client1Port=16000;
    public static int serverPort=16001;
    public static int client2Port=16002;
    public static int max_Size=255;
    public static int maximum_Size=300;

    public static void main(String[] args) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, ClassNotFoundException {

        DatagramSocket sock= new DatagramSocket(client1Port);
        byte[] data1=new byte[max_Size];
        byte[] Data1=new byte[maximum_Size];


        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        PrintStream pout = new PrintStream (bout);
        System.out.println("client1 side : please say sth : ");
        System.out.println();
        Scanner scan=new Scanner(System.in);
        String mess=scan.nextLine();
        pout.print (mess);
        System.out.println();
        data1 = bout.toByteArray();
        DatagramPacket clientPacket=new DatagramPacket(data1,data1.length);
        InetAddress remote_addr =InetAddress.getLocalHost();
        clientPacket.setAddress(remote_addr);
        clientPacket.setPort(client2Port);

        SerializablePacket sp=new SerializablePacket(clientPacket); 


        // Now time to put this packet into another packet :

        ByteArrayOutputStream bStream = new ByteArrayOutputStream();
        ObjectOutputStream oop=new ObjectOutputStream(bStream); 
        oop.writeObject(sp);
        System.out.println("packet is going inside of another packet ");
        System.out.println();
        Data1 =bStream.toByteArray();

        DatagramPacket serverPacket=new DatagramPacket(Data1,Data1.length);
        serverPacket.setAddress(remote_addr);
        serverPacket.setPort(serverPort);
        // End of puting one packet into another packet step

        System.out.println("server is ready to send the packet ");

        sock.send(serverPacket);
        System.out.println("server sent the packet");




    }

}



/////////////////////////////////////////////////////////////////////////////




package puya;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

public class Server {


    public static int client1Port=16000;
    public static int serverPort=16001;
    public static int client2Port=16002;
    public static int max_Size=255;
    public static int maximum_Size=300;

    public static void main(String[] args) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, ClassNotFoundException {


        byte[] data1=new byte[max_Size];
        byte[] Data1=new byte[maximum_Size];
        SerializablePacket sp=new SerializablePacket();
        DatagramSocket sock= new DatagramSocket(serverPort);

        DatagramPacket serverPacket=new DatagramPacket(Data1,Data1.length);
        DatagramPacket client2Packet=new DatagramPacket(data1,data1.length);
        System.out.println("server is waiting to receive one packet from client ");
        sock.receive(serverPacket);
        System.out.println("server received one");

        ByteArrayInputStream bais=new ByteArrayInputStream(serverPacket.getData());
        ObjectInputStream oos = new ObjectInputStream(bais);
        sp=(SerializablePacket)oos.readObject();

        client2Packet=sp.getDatagramPacket();

        System.out.println("The client packet is extracted from server packet");

        sock.send(client2Packet);
        System.out.println("server is sending client2packet");
            }

}

    enter code here

//////////////////////////////////////////////////////////////////////

package puya;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Client2 {

    public static int serverPort=16001;
    public static int client2Port=16002;
    public static int max_Size=255;

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

        byte[] data1=new byte[max_Size];
        DatagramSocket sock= new DatagramSocket(client2Port);


        DatagramPacket client2Packet=new DatagramPacket(data1,data1.length);
        System.out.println("client 2 is waiting for receiving serverPacket");
        sock.receive(client2Packet);
        System.out.println("The packet is received");


        ByteArrayInputStream bais=new ByteArrayInputStream(client2Packet.getData());

        for (int i=0;i<client2Packet.getLength();i++)
        {
            int data=bais.read();

            if(data == -1)
            {
                break ;
            }
            else
            {
                System.out.print((char)data);
            }
        }

    }

}
//////////////////////////////////////////////////////////////////////////////////////////

    enter code here

package puya;

import java.io.Serializable;
import java.net.DatagramPacket;

public class SerializablePacket implements Serializable {


    public DatagramPacket datagramPacket;

    public DatagramPacket getDatagramPacket() {
        return datagramPacket;
    }

    public void setDatagramPacket(DatagramPacket datagramPacket) {
        this.datagramPacket = datagramPacket;
    }

    public SerializablePacket()
    {}

    public SerializablePacket(DatagramPacket datagramPacket)
    {
        this.datagramPacket=datagramPacket;
    }






}

DatagramPacket不可序列化。将其包装在可序列化类中不会改变这一点。您应该将其成员复制到可序列化类中,特别是数据、偏移量和长度。很难理解你为什么想要序列化地址和端口,但是如果你也需要,就包括它们。

事实上,我说过,我想通过将一个数据包放入另一个数据包来模拟一个轻量级的VPN版本,是否有可能将一个数据包放入另一个数据包中……当然,但如果还没有,这并不能使它可以序列化,正如我已经说过的那样。