Java套接字读取超时,错误后无法读取

Java套接字读取超时,错误后无法读取,java,sockets,Java,Sockets,我正在修复一个Java代码,如下所示- connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod(POST); connection.setRequestProperty("Content-Type", CONTENT_TYPE); connection.setReadTimeout(5 * 60 * 1000); connection.setUse

我正在修复一个Java代码,如下所示-

    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod(POST);
    connection.setRequestProperty("Content-Type", CONTENT_TYPE);
    connection.setReadTimeout(5 * 60 * 1000);
    connection.setUseCaches(false);
    connection.setDoInput(true);
    connection.setDoOutput(true);

    DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
    wr.writeBytes(parameters);
    wr.flush();
    wr.close();

    in = connection.getInputStream();
    connection = null;
它在少量数据交换(包括并发请求)上运行良好。 如果数据很大,或者存在并发请求(对于大数据),则会出现“java.net.SocketTimeoutException:Read timed out”错误。发生此错误后,程序无法读取附加数据或满足附加请求。我必须重新启动服务器(JBoss)

我最初的想法是将setReadTimeOut增加到15。不起作用,仍然会获取大型数据集并发请求的错误

我的其他选择是什么?如何从读取超时错误中恢复

上面的代码使用的是java.net.*


感谢您的帮助..WM

我很确定这与您用来编写http请求主体的DataOutputStream有关。我从未见过有人用DataOutputStream做这件事

DataOutputStream设计用于将基本java类型(int、byte、long等)写入OutputStream。当输入一个字符串时,就像您正在做的那样,它将接受每个字符(2个字节),并将其转换为一个字节,同时忽略字符的最高字节

这可能适用于未设置最高8位的某些字符,但迟早会导致数据丢失。这可能会导致发送一个http请求,该请求指定的内容长度与实际消息正文的长度不同,这将导致远程服务器等待更多永远不会收到的数据

我会用一个BufferedWriter来代替DataOutputStream,它允许您写入字符数据。还考虑使用Apache的HTTPclipse,它比java的HTTURLLoop.

要复杂得多。 干杯,
Tom

A
DataOutputStream
处理
String
数据很好。你的回答与这个问题无关。恐怕我不能同意你的看法。DataOutputStream仅在字符为单字节(基本上是指拉丁1字符)时才能很好地处理字符数据。DataOutputStream无法正确转换希腊语、希伯来语、汉语、阿拉伯语等多字节字符。为了确保这不会造成问题,明智的做法是使用基于字符的编写器替换DataOutputStream。这不会导致内容长度错误的请求。注意,他没有设置它;Java是,它通过提供ByteArrayOutputStream作为连接输出流,并在发送任何内容之前获取字节数来做到这一点。会发生什么?