Java Socket Read Timeout,错误后无法读取

时间:2012-08-06 19:01:03

标签: java sockets

我正在修改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

1 个答案:

答案 0 :(得分:-1)

我很确定它与您用来编写http请求正文的DataOutputStream有关。我从来没有见过有人用DataOutputStream做这件事。

DataOutputStream旨在将原始java类型(int,byte,long等)写入OutputStream。当您使用字符串进行处理时,它将占用每个字符(2个字节),并将其转换为字节,同时忽略字符的最高字节。

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

我会将DataOutputStream替换为例如BufferedWriter,允许您编写字符数据。还要考虑使用apache的HttpClient,它比java的HttpUrlConnection复杂得多。

干杯, 汤姆