我有一个具有客户端服务器体系结构的应用程序。客户端
将Java Web Start与Java Swing / AWT一起使用,而sert将HTTP服务器/ Servlet与
雄猫
通信是通过对象的序列化进行的,创建一个
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()是错误所在

最佳答案

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

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


  • 神秘。

    根据您更新的问题,以上都不是。这还有其他几种可能性:
  • 由于某种原因,客户端要么在序列化期间完全锁定了,要么花费了很长时间。
  • 客户端和服务器之间存在代理,这会引起问题。
  • 您遇到与负载有关的网络问题,或网络硬件问题。


  • 另一个可能的解释是您存在内存泄漏,并且速度下降是由GC耗尽内存所花费的时间越来越多所引起的。如果启用它们,它将显示在GC日志中。

    08-04 20:21