java.net.SocketTimeoutException:读取超时

时间:2010-03-20 02:25:39

标签: java tomcat sockets socketexception objectinputstream

我有一个客户端服务器架构的应用程序。客户端 使用Java Web Start和Java Swing / AWT,sert使用HTTP server / Servlet Tomcat的。 通信是从对象的序列化,创建一个 ObjectOutput序列化一个字节数组并发送到服务器 分别调用ObjectInputStream并反序列化。

应用程序遵循正确的通信方式 并发时间开始显示错误 “SocketException读取超时”。当服务器调用该方法时会发生错误 我的servlet doPost方法中的ObjectInputStream.getObject()。

tomcat将变慢并且错误开始减少服务器响应时间,直到我必须重新启动服务器并且一切正常后的崩溃时间。

有人遇到过这个问题吗?

客户代码

URLConnection conn =  url.openConnection();
conn.setDoOutput(true);

OutputStream os = conn.getOutputStream();
ObjectOutputStream oss = new ObjectOutputStream(os);

oss.writeUTF("protocol header sample");

oss.writeObject(_parameters);
oss.flush();
oss.close();

服务器代码

ObjectInputStream input = new ObjectInputStream(_request.getInputStream());
String method = input.readUTF();

parameters = input.readObject();

input.readObject()是错误的地方

2 个答案:

答案 0 :(得分:10)

您还没有给我们提供太多信息,尤其是关于客户端的信息。但我怀疑客户方是:

  • 未能设置Content-length标头(或将其设置为错误的值),
  • 无法刷新输出流和/或
  • 未关闭套接字的输出端。

神秘。

根据您更新的问题,它看起来不像以上那样。以下是其他几种可能性:

  • 由于某种原因,客户端要么在序列化期间完全锁定,要么花费很长时间。
  • 客户端和服务器之间存在导致问题的代理。
  • 您遇到与负载相关的网络问题或网络硬件问题。

另一个可能的解释是你有一个内存泄漏,并且当你的内存不足时,GC会花费越来越多的时间来减慢速度。如果已启用它们,它将显示在GC日志中。

答案 1 :(得分:0)

我认为在高并发期间,Tomcat中设置的套接字超时已过期且连接已关闭。 Tomcat对该连接的下一次读取大于服务器中指定的服务器套接字超时 如果要避免此问题,则必须增加服务器端的超时(在您的情况下已过期)。但不可取。
顺便说一句,你没有提供足够的信息。你是否在Tomcat中增加了连接线程的数量?如果你这样做,肯定会发生这种情况。