我试图使用套接字实现HTTP服务器。如果客户端(例如浏览器)请求目录,服务器将显示可用文件的列表。客户端请求文件时出现问题。我得到以下错误:java.net.SocketException:通过peer重置连接:套接字写入错误在服务文件时
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
at cf.charly1811.java.web.RequestHandler.writeFile(RequestHandler.java:152)
at cf.charly1811.java.web.RequestHandler.processRequest(RequestHandler.java:139)
at cf.charly1811.java.web.RequestHandler.handleRequest(RequestHandler.java:110)
at cf.charly1811.java.web.RequestHandler.run(RequestHandler.java:86)
at java.lang.Thread.run(Thread.java:745)
堆栈跟踪显示问题从writeFile()
方法来:
private void writeFile(File request) throws IOException
{
InputStream byteReader = new BufferedInputStream(new FileInputStream(request));
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = byteReader.read(buffer)) != -1)
{
outputStream.write(buffer, 0, bytesRead);
}
byteReader.close();
}
但我无法弄清楚什么是错的。 你能帮我吗?
编辑
谢谢大家对你的答案。在我阅读你的答案之后,我明白问题在于发生错误时的Socket。这里的是我的错误代码:
// Method to process a single request
handleRequest() throw IOException
{
// process here
// if the client request a file
writeFile();
// close socket when the request is processed
}
// The method is called
public run()
{
try{
// If an error occurs the try/catch won't be called because it is implemented outside the loop. So when an IOException occurs, the loop just stop and exit the program
while(true)
{
handleRequest();
}
}
catch(IOException e) {
// Handle exception here
}
}
我的新的代码一直在寻找这样的:
// Method to process a single request
handleRequest()
{
try {
// process here
// if the client request a file
writeFile();
// close socket when the request is processed
}
// If this exception occurs the catch() method will be called
catch(IOException e)
{
// handle exception here
}
}
// The method is called
public run()
{
while(true)
{
handleRequest();
}
}
}
您可能需要查看远程主机上发生了什么(“clent”)。建议:尝试[Wireshark](http://www.wireshark.org)。 – FoggyDay 2014-09-01 19:14:26
当发生IOException时,'while(true)'循环必须正常退出。编辑中的新代码存在一个新问题,即如果套接字异常关闭,“while”循环将永远旋转。 – bond 2014-09-02 02:44:49
@baconoverlord你对此有何建议? – 2014-09-02 02:47:19