askPY 2024-04-10 20:49 采纳率: 60%
浏览 32

Exception in thread "main" java.net.SocketException: Connection reset

Java网络通信编程中,当使用绝对路径读取文件时,会报错Exception in thread "main" java.net.SocketException: Connection reset;而当文件保存到src目录下时,就可以顺利读取。请问这是什么原因?

//服务端
package ex01;

import UDP01.StreamUtils;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        Socket socket=serverSocket.accept();

        String fileName = "";

        InputStream inputStream = socket.getInputStream();
        byte[] b = new byte[1024];
        int len=0;
        while ((len = inputStream.read(b))!=-1) {
            fileName += new String(b, 0, len);
        }

        System.out.println("文件名称="+fileName);

        String resFileName = "";

        if ("Enfance".equals(fileName)) {
            resFileName = "e:\\JAVACODE\\Enfance.mp3";
            //resFileName = "src\\Enfance.mp3";
        } else {
            resFileName = "e:\\JAVACODE\\boa.mp3";
            //resFileName = "src\\boa.mp3";
        }

        //创建一个输入流,读取文件
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(resFileName));

        byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        bos.write(bytes);

        socket.shutdownOutput();
        inputStream.close();
        socket.close();
        serverSocket.close();


    }
}


```java
//客户端
package ex01;

import UDP01.StreamUtils;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import java.util.stream.Stream;

public class client {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要下载的文件名:");
        String fileName=scanner.next();
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);

        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(fileName.getBytes());
        socket.shutdownOutput();

        //读取服务端返回的字节数组
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());

        byte[] bytes = StreamUtils.streamToByteArray(bis);
        String filePath = "e:\\JAVACODE\\" + fileName + ".mp3";
        //得到一个输出流,写入磁盘
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));

        bos.write(bytes);

        bos.close();
        bis.close();
        outputStream.close();
        socket.close();

    }
}


![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/d61825c6e8204deb9935edc212b5e79f.png "#left")
  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-10 20:49
    关注

    引自免费微信小程序:皆我百晓生

    非常抱歉给您带来了困扰,以下是针对您问题的回答:

    在处理这种情况时,需要注意的是,即使当前文件被保存为src目录下的某个子目录下,也不能确定服务器端返回的字节数组中的具体文件内容。因此,在尝试将这些数据写入磁盘之前,我们需要先从服务端获取到正确的文件信息。

    在这种情况下,我们可以考虑使用FileInputStream来读取服务器端返回的字节数组,并从中提取出文件名,然后将这些文件名作为参数传递给OutputStream对象的构造函数,以便将这些文件内容写入目标磁盘。

    这是一个基本的示例代码:

    public class downloadExample {
    
        public static void main(String[] args) throws IOException {
            // 获取服务端返回的字节数组
            byte[] bytes = ...;
    
            // 创建一个FileInputStream对象
            FileInputStream fis = new FileInputStream(...);
    
            // 使用FileInputStream的read方法读取字节数组
            int length = fis.read(bytes);
    
            // 获取文件名并将其转换为字符串
            String fileName = ...;
    
            // 将文件名作为参数传递给OutputStream对象的构造函数
            OutputStream os = new FileOutputStream(fileName);
    
            // 将字节数组写入目标磁盘
            os.write(bytes);
    
            // 关闭流件
            os.close();
        }
    }
    

    对于代码注释,我已经尽可能地提供了简化描述,如果有任何疑问,请随时告诉我。如果您有其他问题,欢迎继续提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月10日

悬赏问题

  • ¥15 P1口接8个发光二极管,利用定时计数器1编写程序
  • ¥20 keil5编译找不到.h文件该如何解决
  • ¥15 安卓EVS如何开启服务正常实现功能
  • ¥15 canal读取mysql时报错
  • ¥15 关于 S7-PLCSIM Advanced 5.0本地TCP连接无法读写数据
  • ¥15 关于温度改变石墨烯介电性能(关键词-介电常数)
  • ¥150 HDMI分路器LT86102 的输出在890MHz频点处EMC超标8DB
  • ¥15 druid(相关搜索:数据库|防火墙)
  • ¥15 大一python作业
  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。