Java使用ObjectStream传输Socket对象报错的原因及解决方法
为什么无法通过ObjectStream传输Socket对象
你遇到的NotSerializableException异常是Java序列化机制的硬性限制导致的:
- Java的
ObjectOutputStream只能序列化实现了java.io.Serializable标记接口的类,并不是所有继承自Object的类都能序列化,Object类本身也没有实现Serializable接口,而java.net.Socket从设计上就没有实现该接口。 - 即使你通过反射等手段强行实现Socket的序列化,传输到另一端也完全无法使用:Socket是操作系统内核层面的资源,绑定了当前设备的端口、TCP连接状态、文件描述符等本地独有信息,反序列化得到的对象无法对应到对端操作系统的任何网络资源,没有实际意义。
正确实现双向通信的方案
你不需要传输Socket对象本身就能实现客户端和服务端的双向通信:你当前代码中客户端和服务端已经成功建立了TCP连接,双方各自持有的本地Socket实例就可以用来收发数据,直接复用该连接即可实现双向传输,修改后的可运行代码如下:
服务端代码
package com.company; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException, ClassNotFoundException { ServerSocket ss = new ServerSocket(1234); Socket socket = ss.accept(); System.out.println("Connection from " + socket + "!\n"); // 读取客户端发送的内容 ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); String receiveMsg = (String) objectInputStream.readObject(); System.out.println("收到客户端消息:" + receiveMsg); // 向客户端返回响应 ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); objectOutputStream.writeObject("服务端已收到你的消息"); objectInputStream.close(); objectOutputStream.close(); socket.close(); ss.close(); } }
客户端代码
package com.company; import java.io.*; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException, ClassNotFoundException { Socket socket = new Socket("localhost", 1234); // 向服务端发送内容 ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); objectOutputStream.writeObject("你好,我是客户端"); // 读取服务端返回的响应 ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); String receiveMsg = (String) objectInputStream.readObject(); System.out.println("收到服务端消息:" + receiveMsg); objectOutputStream.close(); objectInputStream.close(); socket.close(); } }
如果你的需求是在多个客户端之间转发消息,只需要服务端维护所有已连接的Socket实例,作为中转节点转发数据即可,不需要传输Socket对象本身。
内容的提问来源于stack exchange,提问作者pingupingu
相关产品推荐
相关产品推荐

