java.net.SocketTimeoutException:读取超时

Raf*_*oto 8 java sockets tomcat objectinputstream socketexception

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

应用程序遵循正确的并发通信时间,并开始显示错误"SocketException read timeout".当服务器在我的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();
Run Code Online (Sandbox Code Playgroud)

服务器代码

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

parameters = input.readObject();
Run Code Online (Sandbox Code Playgroud)

input.readObject()是错误的位置

Ste*_*n C 10

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

  • 无法设置Content-length标头(或将其设置为错误的值),
  • 无法刷新输出流,和/或
  • 没有关闭插座的输出侧.

神秘.

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

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

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