我想知道,我如何序列化DatagramPacket ...在我的代码中,我有两个客户端通过服务器进行交互。 client1将client2Packet放入serverPacket并将其发送到服务器和服务器解压缩client2Packet并将其发送到client2。(一些如何模拟VPN)但是我一直面临着" java.io.NotSerializableException" ,我创建了一个实现接口" Serializable" ,但还是.....所以,请帮帮我:)"首先,我想知道这是可能的,如果是,请告诉我如何,谢谢,我把我的代码放在下面:`
`在这里输入代码
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;
}
}
答案 0 :(得分:0)
DatagramPacket不可序列化。将它包装在Serializable类中并不会改变它。您应该将成员复制到您的Serializable类中,特别是数据,偏移量和长度。很难理解你为什么要序列化地址和端口,但如果你也需要它们,请加入它们。