Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Servlet请求inputstream读取时套接字超时_Java_Sockets_Servlets_Inputstream_Nio - Fatal编程技术网

Java 从Servlet请求inputstream读取时套接字超时

Java 从Servlet请求inputstream读取时套接字超时,java,sockets,servlets,inputstream,nio,Java,Sockets,Servlets,Inputstream,Nio,我有一段代码,它从Servlet请求的输入流中读取POST数据。我正在使用JavaNIO读取数据 对于大多数情况和常规数据,代码工作得非常好。但是,在某些数据较大的情况下(content length=600000),通道的读取方法似乎会失败,并出现套接字超时错误。而且,这似乎只发生在IE9上,它在Firefox和Chrome上运行良好 在调查这一点时,我发现,在使用IE时,post数据似乎比其他浏览器需要更长的时间才能读取。因此,我在代码之前放了一个线程。sleep(400),代码开始对IE正

我有一段代码,它从Servlet请求的输入流中读取POST数据。我正在使用JavaNIO读取数据

对于大多数情况和常规数据,代码工作得非常好。但是,在某些数据较大的情况下(
content length=600000
),通道的读取方法似乎会失败,并出现套接字超时错误。而且,这似乎只发生在IE9上,它在Firefox和Chrome上运行良好

在调查这一点时,我发现,在使用IE时,post数据似乎比其他浏览器需要更长的时间才能读取。因此,我在代码之前放了一个
线程。sleep(400)
,代码开始对IE正常工作

我不想把睡眠放在这段代码之前,它只是一个解决方法,不是一个合适的解决方案,其次,没有正确的睡眠时间,因为如果数据增加,400可能不够

有没有一种方法可以告诉频道不要超时或完全取消超时

下面是正在使用的代码

ReadableByteChannel channel = Channels.newChannel(inputStream);
byte[] postData = new byte[contentLength];
ByteBuffer buf = ByteBuffer.allocateDirect(contentLength);
int numRead = 0;
int counter = 0;
while (numRead >= 0) {
    buf.rewind();
    numRead = channel.read(buf);
    buf.rewind();
    for (int i = 0; i < numRead; i++) {
       postData[counter++] = buf.get();
    }
}
return postData;
ReadableByteChannel通道=通道.newChannel(inputStream);
字节[]postData=新字节[contentLength];
ByteBuffer buf=ByteBuffer.allocateDirect(contentLength);
int numRead=0;
int计数器=0;
while(numRead>=0){
buf.倒带();
numRead=通道读取(buf);
buf.倒带();
对于(int i=0;i
inputStream直接通过request.getInputStream()生成,内容长度通过request.getContentLength()生成


使用的容器是嵌入式模式下的Tomcat 7.0.42。

您的读取超时太短。增加它


但是我会扔掉这个NIO代码,直接从输入流读取。对于DataInputStream.readFully(),这是一行代码。您的NIO代码无论如何都可以做到这一点,但它采用了一种非常迂回的方式,有几个额外的层。

如果您可以读取content-length头,您可以根据它增加睡眠时间。这至少可以使您的代码在不同的场景中运行。这当然是一个解决办法,但似乎是一个可靠的办法。或者,你也可以。但是,此更改适用于您的所有servlet,灵活性要差得多。

因为我找不到任何适当的解决方案来解决此问题。我一直在继续我现有的工作,即睡眠一段时间。但我的问题是我需要睡多久,因为数据越大,我需要睡得更多。没有正确的方法知道,因为我无法从内容长度中推导出任何公式,所以睡眠时间是随机的


因此,我可以应用的下一个最好的方法是,我捕获套接字超时异常,并在我知道需要的最短时间(即400毫秒)内睡眠。然后再试一次,将逻辑设置为3次重试,然后放弃。到目前为止,这已经起到了作用,因为数据量不断增加。

发布您的代码,然后也许我们可以帮助您!POST请求是否来自您的客户端代码?如果是,它是什么技术?有关java中http请求超时的信息,请参阅以下帖子:。@MarkTielemans,是的,该帖子来自客户端代码。使用SmartGWT(javascript工具包)。您提到的链接似乎提供了有关客户端超时的详细信息。而在我的例子中,这个错误似乎是由于服务器放弃,没有等待足够的时间。您是使用现成的tomcat配置还是进行了自定义?例如,是否有人将
connectionTimeout
connectionUploadTimeout
设置为某个值,认为这是秒,但实际上是毫秒。@Alcanzar,不完全是,使用标准配置。所有超时都被适当地设置。如何在servlet获取的inputstream上增加读取超时?我希望它需要对具体的客户端实现进行一定程度的修改?@Szymon这确实为问题提供了答案,而且它不包括,甚至不包含批评或澄清请求。您在胡说八道。@AndersR.Bystrup请求的读取超时将在未命名Servlet容器的某些配置中设置,或者在将输入流映射到通道的未声明代码中设置。@Szymon那么来自审阅注释的自动注释就是胡说八道。所有答案都可以扩展。如果您有具体建议,请提供。到目前为止,这只是噪音。@EJP在描述中添加了更多细节。只有当我在代码上方添加Thread.sleep(400)时,它似乎才起作用。这表示服务器没有等待足够的POST数据可用。任何关于应该在何处设置超时的指针(如果有的话)。您提到的线程讨论了ApacheJK连接器到tomcat下的设置。