Socket收发字符串与对象异常:服务器未接收到字符串求助
嘿,我之前也踩过类似的Socket通信坑!服务器收不到客户端先发送的字符串,大概率是数据流类型不匹配或者流的创建顺序搞反了,咱们来拆解问题:
核心问题1:流的创建顺序完全反了!
你当前代码里先创建ObjectInputStream,再创建ObjectOutputStream——这是Java Socket用对象流通信的典型错误!
ObjectOutputStream在构造时会自动发送一个序列化头信息,如果你先创建ObjectInputStream,它会一直阻塞等待这个头,导致后续的读取逻辑根本没法执行,自然收不到任何数据。
核心问题2:字符串的收发方式不匹配
如果客户端是用普通字节流(比如OutputStream.write())或者PrintWriter发送字符串,而服务器用ObjectInputStream读取,两者格式不兼容,服务器肯定读不到有效数据。好在String本身实现了Serializable接口,完全可以用对象流直接收发。
修正后的服务器代码示例
try { // 重中之重:先创建输出流,再创建输入流! ObjectOutputStream toClientObject = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream fromClientObject = new ObjectInputStream(socket.getInputStream()); while(!socket.isClosed()) { // 先读取客户端发来的字符串(和客户端发送顺序对应) String receivedString = (String) fromClientObject.readObject(); System.out.println("收到客户端字符串:" + receivedString); // 再读取客户端发来的对象 Object receivedObject = fromClientObject.readObject(); System.out.println("收到客户端对象:" + receivedObject); // 执行你的业务逻辑 doSomething(); // 向客户端返回字符串和对象 toClientObject.writeObject("服务器处理完成通知"); toClientObject.writeObject(yourResponseObject); // 自定义对象要实现Serializable toClientObject.flush(); // 一定要flush,避免数据滞留在缓冲区 } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); // 异常处理:关闭流、socket等资源 try { if (socket != null && !socket.isClosed()) socket.close(); } catch (IOException ex) { ex.printStackTrace(); } }
客户端也要对应调整
客户端必须和服务器保持完全一致的流创建顺序和收发顺序,示例代码:
// 客户端同样先创建输出流 ObjectOutputStream toServer = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream fromServer = new ObjectInputStream(socket.getInputStream()); // 先发送字符串 toServer.writeObject("客户端发送的测试字符串"); // 再发送对象 toServer.writeObject(yourClientObject); // 自定义对象必须实现Serializable toServer.flush(); // 读取服务器返回的内容 String serverReplyStr = (String) fromServer.readObject(); Object serverReplyObj = fromServer.readObject();
额外注意事项
- 所有要通过对象流发送的自定义类,必须实现
Serializable接口(可以加个空的serialVersionUID避免序列化版本问题)。 - 读写顺序必须严格对应:客户端发A→发B,服务器必须读A→读B,乱序会直接抛出异常或读取到错误数据。
- 通信结束后要正确关闭流和Socket,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Lucky38i
相关产品推荐
相关产品推荐

