java.net.SocketTimeoutException:读取超时
我有一个客户端-服务器架构的应用程序。客户 使用JavaWebStart和JavaSwing/AWT,sert使用HTTP服务器/Servlet和 雄猫。 通信是通过对象的序列化进行的,创建 ObjectOutput序列化字节数组并发送到服务器 分别调用ObjectInputStream和反序列化 应用程序遵循正确通信到某个特定位置 开始显示错误的并发时间 “SocketException读取超时”。当服务器调用该方法时会发生错误 我的servlet doPost方法中的ObjectInputStream.getObject() tomcat会变慢,错误开始减少服务器响应时间,直到崩溃时间,我必须在一切正常后重新启动服务器 有人经历过这个问题 客户端代码java.net.SocketTimeoutException:读取超时,java,tomcat,sockets,socketexception,objectinputstream,Java,Tomcat,Sockets,Socketexception,Objectinputstream,我有一个客户端-服务器架构的应用程序。客户 使用JavaWebStart和JavaSwing/AWT,sert使用HTTP服务器/Servlet和 雄猫。 通信是通过对象的序列化进行的,创建 ObjectOutput序列化字节数组并发送到服务器 分别调用ObjectInputStream和反序列化 应用程序遵循正确通信到某个特定位置 开始显示错误的并发时间 “SocketException读取超时”。当服务器调用该方法时会发生错误 我的servlet doPost方法中的ObjectInputS
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()就是错误所在您没有给我们提供太多的信息,特别是关于客户端的信息。但我怀疑客户方:
- 未能设置内容长度标题(或将其设置为错误值)
- 未能刷新输出流,和/或
- 不关闭插座的输出侧
神秘的 根据你最新的问题,上面看起来没有一个。以下是其他几种可能性:
- 出于某种原因,客户端要么在序列化过程中完全锁定,要么需要很长时间
- 客户机和服务器之间存在导致问题的代理
- 您遇到与负载相关的网络问题或网络硬件问题
另一种可能的解释是内存泄漏,而导致速度减慢的原因是GC在内存耗尽时花费了越来越多的时间。如果启用了GC日志,则会在这些日志中显示 我认为在高并发期间,Tomcat中设置的套接字超时过期,连接关闭。Tomcat对该连接的下一次读取大于服务器中指定的服务器套接字超时。
如果您想避免这个问题,您必须增加服务器端的超时时间,在您的情况下超时时间已经过期。但不可取。
顺便说一句,你没有提供足够的信息。您是否增加了Tomcat中连接的线程数?如果你这样做了,这肯定会发生 SocketException之前经过的时间是20分钟还是更长?(如果我回忆起tcp/ip套接字在没有连接活动时超时之前的标准等待时间)?在所有异常都告诉您“读取超时”之后,这是否也可能与web的异步性质有关?这是一个tcp linux参数?比如缓冲区内存大小、最大打开文件数还是其他?