向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
相关产品推荐
相关产品推荐

