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)?连接在哪里被关闭?_Java_Sockets_Http_Server - Fatal编程技术网

如何修复断开的管道套接字异常(Java)?连接在哪里被关闭?

如何修复断开的管道套接字异常(Java)?连接在哪里被关闭?,java,sockets,http,server,Java,Sockets,Http,Server,我正在为一个学校项目开发一个多线程web服务器。我应该能够进入浏览器上的本地主机并请求3个不同的文件(.htm、.jpeg、.pdf)。但是,当我对一个包含图片的.htm文件执行此操作时(2个请求),浏览器中会显示.htm文件,但我尝试对图片执行的每次写入操作都会出现许多断管套接字异常(分配要求一次写入1024字节)。我的实现方式显然有问题,但当我尝试为第二个文件编写时,我不知道连接在哪里被关闭 我尝试了一些不同的方法来解决这个问题,包括尝试读取套接字输入流时的循环,但我认为这违背了多线程服务器

我正在为一个学校项目开发一个多线程web服务器。我应该能够进入浏览器上的本地主机并请求3个不同的文件(.htm、.jpeg、.pdf)。但是,当我对一个包含图片的.htm文件执行此操作时(2个请求),浏览器中会显示.htm文件,但我尝试对图片执行的每次写入操作都会出现许多断管套接字异常(分配要求一次写入1024字节)。我的实现方式显然有问题,但当我尝试为第二个文件编写时,我不知道连接在哪里被关闭

我尝试了一些不同的方法来解决这个问题,包括尝试读取套接字输入流时的循环,但我认为这违背了多线程服务器的目的

服务器:

    while(true){
        try {
            sock = servSock.accept(); // Handles the connection
            // Connection received log
            System.out.println("Connection received: " + new Date().toString() + " at " + sock.getInetAddress() + sock.getPort());
            HTTP pro = new HTTP(sock); // Client handler
            pro.run();

            ServerThread serverThread = new ServerThread(pro); 
            // Starts ServerThread
            serverThread.start();
        } catch (Exception e){
            System.out.println(e);
        }
    }
HTTP:


公开募捐{
//试着打开阅读器
试一试{
readSock=new BufferedReader(新的InputStreamReader(sock.getInputStream());
}捕获(例外e){
系统输出打印ln(e);
}
//开放输出流
试一试{
this.out=新的DataOutputStream(sock.getOutputStream());
this.printOut=新的PrintWriter(sock.getOutputStream());
}捕获(例外e){
系统输出打印ln(e);
}
//试着读进线
试一试{
this.reqMes=readSock.readLine();
}捕获(IOE异常){
e、 printStackTrace();
}
StringTokenizer st=新的StringTokenizer(需求);
//解析请求消息
整数计数=0;
而(st.hasMoreTokens()){
String str=st.nextToken();
如果(计数=1){
this.fileName=“.”+str;
}
计数+=1;
}
System.out.println(“收到的文件名”);
File=null;
试一试{
file=新文件(此.fileName);
this.f=新文件输入流(file);//文件输入流
this.fileExists=true;
System.out.println(“文件”+this.fileName+“存在”);
}catch(filenotfounde异常){
系统输出打印ln(e);
this.fileExists=false;
System.out.println(“文件不存在”);
}
字节[]缓冲区=新字节[1024];
//写入状态行
如果(此.fileExists){
System.out.println(“尝试写入数据”);
试一试{
this.out.writeBytes(“HTTP/1.0”+“200ok”+this.CRLF);
this.out.flush();
this.printOut.println(“HTTP/1.0”+“200ok”+this.CRLF);
//写头
this.out.writeBytes(“内容类型:”+getMime(this.fileName)+this.CRLF);
this.printOut.println(“内容类型:”+getMime(this.fileName)+this.CRLF);
this.out.flush();
//读取文件数据
字节[]文件数据=新字节[1024];
while(this.f.read(fileData)!=-1){
//写入文件数据
试一试{
this.out.write(fileData,01024);
this.out.flush();//刷新输出流
}捕获(IOE异常){
系统输出打印ln(e);
}
}
系统输出打印项次(“冲洗”);
}捕获(IOE异常){
e、 printStackTrace();
}
}
对于浏览器中的一个.htm文件,该文件和html看起来很好。但它似乎在html文件中再次请求一个.jpeg文件,并且浏览器无法加载java.net.SocketException:每次写入数据时管道破裂(写入失败)

this.out.write(fileData,01024);

谢谢你,非常感谢你的帮助。

在各种问题中搜索了很多之后,我找到了答案

问题在于响应标头的格式不正确,导致连接过早结束。必须在标头之后发送另一个空行(\r\n)。

以下代码现在起作用(this.CRLF等于“\r\n”):

public void run(){
//试着打开阅读器
试一试{
readSock=new BufferedReader(新的InputStreamReader(sock.getInputStream());
}捕获(例外e){
系统输出打印ln(e);
}
//开放输出流
试一试{
this.out=新的DataOutputStream(sock.getOutputStream());//数据输出
this.printOut=新的PrintWriter(sock.getOutputStream());//打印输出
}捕获(例外e){
系统输出打印ln(e);
}
//试着读进线
试一试{
this.reqMes=readSock.readLine();
}捕获(IOE异常){
e、 printStackTrace();
}
StringTokenizer st=新的StringTokenizer(需求);
//解析请求消息
整数计数=0;
而(st.hasMoreTokens()){
String str=st.nextToken();
如果(计数=1){
this.fileName=“.”+str;
}
计数+=1;
}
System.out.println(“收到的文件名”);
//初始化要发送的文件
File=null;
//尝试查找文件并创建输入流
试一试{
file=新文件(此.fileName);
this.f=新文件输入流(file);//文件输入流
this.fileExists=true;
System.out.println(“文件”+this.fileName+“存在”);
}catch(filenotfounde异常){
系统输出打印ln(e);
this.fileExists=false;
System.out.println(“文件不存在”);
}
字节[]缓冲区=新字节[1024];
//写入状态行