8

我有一个具有客户端服务器架构的应用程序。客户端使用 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();

服务器代码

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

parameters = input.readObject();

input.readObject() 是错误所在

4

2 回答 2

10

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

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

神秘。

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

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

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

于 2010-03-20T03:11:09.160 回答
0

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

于 2012-08-29T13:15:13.303 回答