欢迎访问宙启技术站
智能推送

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进行反序列化。在实际开发中,需要注意序列化和反序列化的版本、序列化的安全性等问题。