Java Socket通信的序列化和反序列化的实例介绍
发布时间:2023-05-18 03:26:27
Java Socket通信时,需要将要传输的对象进行序列化和反序列化,以便在网络上传输并在接收端恢复对象。本文将通过一个简单的例子介绍Java序列化和反序列化的实现方式。
1. 创建一个简单的Serializable类Person
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
2. 创建Server端和Client端
Server端
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ServerSocket server = new ServerSocket(8888);
System.out.println("Server started!");
while (true) {
Socket socket = server.accept();
System.out.println("Client connected!");
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
Person p = (Person) ois.readObject();
System.out.println("Received person object: " + p.getName() + ", " + p.getAge());
// Modify the person object
p.setName("Tom");
p.setAge(30);
oos.writeObject(p);
ois.close();
oos.close();
socket.close();
}
}
}
Client端
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String hostName = "localhost";
int portNumber = 8888;
Socket socket = new Socket(hostName, portNumber);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Person p = new Person("Jack", 25);
oos.writeObject(p);
System.out.println("Sent person object: " + p.getName() + ", " + p.getAge());
Person modifiedP = (Person) ois.readObject();
System.out.println("Received modified person object: " + modifiedP.getName() + ", " + modifiedP.getAge());
oos.close();
ois.close();
socket.close();
}
}
3. 运行Server端和Client端
在运行Server端和Client端之前,需要先编译Person、Server和Client类,可以使用以下命令:
javac Person.java javac Server.java javac Client.java
然后,在不同的控制台窗口中先后运行Server端和Client端:
java Server java Client
在Client端的控制台中会输出发送的Person对象信息,如:
Sent person object: Jack, 25
在Server端的控制台中会输出接收的Person对象信息,如:
Received person object: Jack, 25
同时,Server端会将接收到的Person对象进行修改(将名字改为Tom,年龄改为30),并将修改后的对象返回到Client端。在Client端的控制台中会输出接收到的修改后的Person对象信息,如:
Received modified person object: Tom, 30
以上过程中,Person对象在网络中的传输就是通过Java序列化和反序列化实现的。
4. 小结
Java序列化和反序列化是网络传输中常用的技术。在Socket通信中,需要将要传输的对象进行序列化和反序列化,以便在网络上传输并在接收端恢复对象。Java内置了序列化和反序列化的机制,需要将目标对象实现Serializable接口,然后将该对象封装成ObjectOutputStream进行序列化,接收端则需要使用ObjectInputStream进行反序列化。在实际开发中,需要注意序列化和反序列化的版本、序列化的安全性等问题。
