【问题标题】:java.net.SocketTimeoutException: Read timed outjava.net.SocketTimeoutException:读取超时
【发布时间】:2011-01-29 17:07:54
【问题描述】:

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

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

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() 是错误所在

【问题讨论】:

  • 在 SocketException 之前经过的时间量是 20 分钟还是更长? (如果我记得如果没有连接活动,tcp/ip 套接字将在超时之前等待的标准时间)?毕竟异常告诉你“读取超时”也可能与网络的异步性质有关?
  • 是tcp linux参数?像缓冲区内存大小、最大打开文件或其他?

标签: java tomcat sockets socketexception objectinputstream


【解决方案1】:

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

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

神秘。

根据您更新的问题,以上都不是。以下是其他几种可能性:

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

另一种可能的解释是您有内存泄漏,并且速度变慢是由于内存不足导致 GC 花费越来越多的时间造成的。如果您启用它们,这将显示在 GC 日志中。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多