我有一个客户端服务器架构的应用程序。客户端 使用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()是错误的地方
答案 0 :(得分:10)
您还没有给我们提供太多信息,尤其是关于客户端的信息。但我怀疑客户方是:
神秘。
根据您更新的问题,它看起来不像以上那样。以下是其他几种可能性:
另一个可能的解释是你有一个内存泄漏,并且当你的内存不足时,GC会花费越来越多的时间来减慢速度。如果已启用它们,它将显示在GC日志中。
答案 1 :(得分:0)
我认为在高并发期间,Tomcat中设置的套接字超时已过期且连接已关闭。 Tomcat对该连接的下一次读取大于服务器中指定的服务器套接字超时
如果要避免此问题,则必须增加服务器端的超时(在您的情况下已过期)。但不可取。
顺便说一句,你没有提供足够的信息。你是否在Tomcat中增加了连接线程的数量?如果你这样做,肯定会发生这种情况。