You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向Servlet传输Serializable对象时遭遇EOFException问题求助

问题:Serializable对象发送至Servlet时出现EOFException错误

我尝试将一个实现了Serializable接口的简单Test对象发送到Servlet,但遇到了EOFException错误,调用ServletInputStream的ready()方法返回false。以下是相关代码及异常信息,寻求解决办法:


Test类代码

import java.io.Serializable;

public class Test implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

}

客户端连接Servlet代码

URLConnection yc = connect.openConnection();
yc.setDoInput(true);
yc.setDoOutput(true);

BufferedReader in = new BufferedReader(
                        new InputStreamReader(
                        yc.getInputStream()));
String inputLine;

Test test = new Test();

ObjectOutputStream objectOutputStream 
  = new ObjectOutputStream(yc.getOutputStream());
objectOutputStream.writeObject(test);
objectOutputStream.flush();
objectOutputStream.close();

Servlet代码

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    doPost(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    ServletInputStream inputStream = request.getInputStream();
    ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
    
    try {
        Test test = (Test) objectInputStream.readObject();
        objectInputStream.close();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

Servlet端异常栈信息

Servlet.service() for servlet [TransactionServlet] in context with path [/HashingNode] threw exception
java.io.EOFException
    at java.base/java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2860)
    at java.base/java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3355)
    at java.base/java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:939)
    at java.base/java.io.ObjectInputStream.<init>(ObjectInputStream.java:381)
    at TransactionServlet.doPost(TransactionServlet.java:58)
    at TransactionServlet.doGet(TransactionServlet.java:38)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

问题原因与解决方法

核心原因

客户端代码中提前获取了输入流(yc.getInputStream()),这会直接触发HTTP请求的发送,此时还没有写入任何对象数据,导致Servlet端接收到的请求体为空,初始化ObjectInputStream时自然会抛出EOFException。

修复后的客户端代码

调整代码顺序,先写入对象数据,再获取输入流读取响应:

URLConnection yc = connect.openConnection();
yc.setDoInput(true);
yc.setDoOutput(true);

// 先完成对象写入操作
Test test = new Test();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(yc.getOutputStream());
objectOutputStream.writeObject(test);
objectOutputStream.flush();
objectOutputStream.close();

// 再读取Servlet响应
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
    // 处理响应内容
}
in.close();

额外注意事项

  • 确保客户端与Servlet端的Test类完全一致:包名、类名、serialVersionUID必须相同,否则会触发ClassNotFoundException。
  • 若不需要读取Servlet响应,可以直接去掉输入流相关代码,但建议保留以验证请求是否成功发送。
  • 可在Servlet端添加前置校验:通过request.getContentLength()判断请求体长度是否大于0,确认是否接收到数据。

内容的提问来源于stack exchange,提问作者Kosmita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:01:58