首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java套接字读取超时,出现错误后无法读取

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

Stack Overflow用户
提问于 2012-08-07 03:01:03
回答 1查看 687关注 0票数 0

我正在修复一个Java代码,它看起来像这样-

代码语言:javascript
复制
    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.*。

感谢任何help..WM

EN

回答 1

Stack Overflow用户

发布于 2012-08-07 04:41:44

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

DataOutputStream被设计为向OutputStream写入原始java类型(int、byte、long等)。当输入字符串时,就像您正在做的那样,它将获取每个字符(2个字节),并将其转换为一个字节,而忽略字符的最高字节。

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

我会用BufferedWriter来代替DataOutputStream,它允许你写字符数据。还可以考虑使用apache的HttpClient,它比java的HttpUrlConnection复杂得多。

干杯,汤姆

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11834236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档