Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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 HTTP请求处理程序连接重置错误_Java_Multithreading_Http_Libgdx - Fatal编程技术网

Java HTTP请求处理程序连接重置错误

Java HTTP请求处理程序连接重置错误,java,multithreading,http,libgdx,Java,Multithreading,Http,Libgdx,我正在编写一个简单的HTTP请求处理程序,但在将文件传输到客户端浏览器时,会随机遇到连接重置错误 由于我的程序相当大,我将简化以下代码: public class HTTPRequestHandler implements Runnable { private Queue<HTTPRequest> requests; private volatile boolean flag; ... public void run() { flag

我正在编写一个简单的HTTP请求处理程序,但在将文件传输到客户端浏览器时,会随机遇到连接重置错误

由于我的程序相当大,我将简化以下代码:

public class HTTPRequestHandler implements Runnable {
    private Queue<HTTPRequest> requests;
    private volatile boolean flag;
    ...
    public void run() {
        flag = true;
        while (flag) {
            HTTPRequest request = null;
            synchronized(this) {
                if (requests.size > 0) {
                     request = requests.removeFirst();
                }
            }

            if (request != null) {
                handleRequest(request);
            }
        }
    }
    ...
    private void handleRequest(HTTPRequest request) {
        ...
        try {
            // Send HTTP Header
            request.getSocket().getOutputStream().write(message.getHeader().getBytes());

            // Send HTTP Message Body
            Object messageBody = message.getMessageBody();
            if (messageBody != null && messageBody.getClass() == File.class) {
                Files.copy(((File)messageBody).toPath(), request.getSocket().getOutputStream());
                request.getSocket().getOutputStream().flush();
            } else if (messageBody != null) {
                ...
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ...
    }
公共类HTTPRequestHandler实现可运行{
专用队列请求;
私有易失布尔标志;
...
公开募捐{
flag=true;
while(旗帜){
HTTPRequest请求=null;
已同步(此){
如果(requests.size>0){
request=requests.removeFirst();
}
}
if(请求!=null){
HandlerRequest(请求);
}
}
}
...
私有无效HandlerRequest(HTTPRequest请求){
...
试一试{
//发送HTTP头
request.getSocket().getOutputStream().write(message.getHeader().getBytes());
//发送HTTP消息正文
Object messageBody=message.getMessageBody();
if(messageBody!=null&&messageBody.getClass()==File.class){
copy(((文件)messageBody.toPath(),request.getSocket().getOutputStream());
request.getSocket().getOutputStream().flush();
}else if(messageBody!=null){
...
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
...
}
我可以让这个部分在本地机器上的各种浏览器上大部分时间(并非总是)工作,但它在远程机器上根本不起作用。它主要随机发生在大文件上,有时也发生在小文件上


至于HTTP头,我目前让程序在每次完成响应后关闭连接。

我在进行数据包嗅探后发现此设计存在问题。服务器在客户端确认接收数据包之前发送的数据包太多太快。因此,服务器向客户端发送TCP重置。当客户端t尝试重新建立连接时,服务器拒绝接受连接,因为它已退出用于发送文件的语句,并已关闭套接字连接。客户端将继续处理其他文件,并将尝试再次请求不完整的文件。然后服务器将再次发送文件,但客户端将无法确认在这一点上,客户端只是放弃了该文件

由于我的设计一次只能处理一个请求,并且无法从可能中断的地方恢复,因此请修改我的代码,将文件分成块,并在睡眠一毫秒后一次发送一个块

if (messageBody != null && messageBody.getClass() == File.class) {
    InputStream fileStream = new FileInputStream((File)messageBody);
    byte[] buffer = new byte[8 * 1460]; // Maximum TCP packet size
    int bytesRead;
    while ((bytesRead = fileStream.read(buffer)) != -1) {
        request.getSocket().getOutputStream().write(buffer, 0, bytesRead);
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    fileStream.close();
}