Java HTTP请求处理程序连接重置错误
我正在编写一个简单的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
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();
}