在做多用户通讯系统时,需要将信息以对象的方式通过对象流传输,才可保证接收端能恢复出数据及其类型。以下通过一个简单示例学习将一个对象序列化,通过socket发送至客户端,并在客户端将数据显示。
服务器端实现代码:
/**
* @author JJLin
* @date 2022/2/25
* 本用例用来复习socket获取流对象并通过网络传输的一些细节
* (1)客户端发送消息给服务器端
* (2)服务器端发送一个dog对象给客户端
*/
public class Server {
public static void main(String[] args) throws IOException {
//接收消息
ServerSocket serverSocket = new ServerSocket(8008);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = "";
while ((line = br.readLine()) != null) {
System.out.print(line);
}
//发送Dog对象
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(new Dog("大黄",4));
//关闭资源
socket.close();
serverSocket.close();
br.close();
oos.close();
}
}
class Dog implements Serializable {
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
服务器端实现代码:
/**
* @author JJLin
* @date 2022/2/25
* 本用例用来复习socket获取流对象并通过网络传输的一些细节
* (1)客户端发送消息给服务器端
* (2)服务器端发送一个dog对象给客户端
*/
public class Client {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Socket socket = new Socket(InetAddress.getLocalHost(), 8008);
//发送消息
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write("hello服务器@");
//bw.newLine();
bw.flush();
socket.shutdownOutput();
//接收dog
InputStream is = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
Dog dog = (Dog) ois.readObject();
System.out.println(dog.toString());
//关闭资源
socket.close();
bw.close();
ois.close();
}
}
结果显示:
Socket编程需要IO流知识的支撑,在学习IO流时,需要区分好各种IO流,分清楚哪些是字符流、字节流、转换流、节点流以及处理流(包装流),需注意:包装流需要传入一个相应的节点流。