本地模拟,服务器下载文件

题目要求:

  1. 编写客户端程序和服务器端程序
  2. 客户端可以输入一个音乐 文件名,比如 美丽中国,服务端 收到音乐后,可以给客户端返回这个音乐文件,如果服务器没有这个文件,返回一个默认的音乐即可
  3. 客户端收到文件后,保存到本地E:\\
  4. 提示:该程序可以使用工具类StreamUtils.java

这是工具类StreamUtils.java:

java 复制代码
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

/**
 * 此类用于演示关于流的读写方法
 *
 */
public class StreamUtils {
    /**
     * 功能:将输入流转换成 byte[]
     *
     * @param is
     * @return
     * @throws Exception
     */
    public static byte[] streamToByteArray(InputStream is) throws Exception {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象
        byte[] b = new byte[1024];
        int len;
        while ((len = is.read(b)) != -1) {
            bos.write(b, 0, len);
        }
        byte[] array = bos.toByteArray();
        bos.close();
        return array;
    }
}
/**
 * 功能:将 InputStream 转换成 String
 * @param
 * @return
 * @throws Exception
 */
java 复制代码
import day28.UpLoad.StreamUtils;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

/**
 * @author monian
 * Wo yi wu ta,wei shou shu er!
 */
public class DownLoadReceiver {
    public static void main(String[] args) throws Exception {
        //提示输入你要下载的文件名
        System.out.println("请输入需要下载的文件名:");
        String downFileName ="";
        Scanner sc = new Scanner(System.in);
        downFileName = sc.next();

        //请求到了服务器,准备发送
        Socket socket = new Socket(InetAddress.getLocalHost(),9999);
        //获取和Socket关联的输出流
        OutputStream outputStream = socket.getOutputStream();
        //现在开始发送需要的文件名
        outputStream.write(downFileName.getBytes());
        //设置写入结束的文件标志
        socket.shutdownOutput();

        //4.读取服务器返回的文件数据(字节数据)
         InputStream inputStream = socket.getInputStream();
        byte[] buf = StreamUtils.streamToByteArray(inputStream);

        //5.得到一个输入流,准备将bytes 写入到磁盘文件
        String filePath = "E:\\"+downFileName+".mp3";
        BufferedOutputStream bos =new BufferedOutputStream(new FileOutputStream(filePath));
        bos.write(buf);
        bos.close();

        //6.关闭相关的资源
        bos.close();
        inputStream.close();
        socket.close();
        outputStream.close();
        System.out.println("Client已经关闭~");
    }
}
java 复制代码
import day28.UpLoad.StreamUtils;

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

/**
 * @author monian
 * Wo yi wu ta,wei shou shu er!
 */
public class DownLoadServer {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket =new ServerSocket(9999);
        System.out.println("服务器正在接收~");
        Socket socket = serverSocket.accept();

        //3.读取客户端发送要下载的文件名
        //这里使用while读取文件名,考虑将来客户发送的数据较大的情况
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int len=0;
        String downloadFileName = "";
        while ((len = inputStream.read(buf))!=-1){
            downloadFileName+=new String(buf,0,len);
        }
        System.out.println("客户端希望下载的文件名="+downloadFileName);

        //现在服务器上面有两个文件,无名.mp3  高山流水.mp3
        //如果客户下载的是高山流水 我们就返回该文件 ,否则一律返回 无名.mp3

        String resFileName = "";
        if("高山流水".equals(downloadFileName)){
            resFileName = "E:\\桌面\\demo\\Java\\com.hanshunping\\src\\day28\\Homework03\\高山流水.mp3";
        }else{
            resFileName="E:\\桌面\\demo\\Java\\com.hanshunping\\src\\day28\\Homework03\\musicback.mp3";
        }
        //4.创建一个输入流 ,读取文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(resFileName));

        //5.使用工具类StreamUtils,读取文件到一个字节数组
        byte[] bytes = StreamUtils.streamToByteArray(bis);

        //6.得到Socket关联的输出流
        BufferedOutputStream bos =new BufferedOutputStream(socket.getOutputStream());

        //7.写入数据通道,返回给客户端
        bos.write(bytes);
        socket.shutdownOutput();//一定要关闭,很关键,关闭输入,否则会一直等待

        //8.关闭相关的资源
        bis.close();
        bos.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务端已经退出~");
    }
}
相关推荐
wowocpp5 分钟前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
萨格拉斯救世主27 分钟前
jenkins使用slave节点进行node打包报错问题处理
运维·jenkins
川石课堂软件测试38 分钟前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
pk_xz1234562 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强2 小时前
Linux之sed命令详解
linux·运维·服务器
海绵波波1072 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
九河云4 小时前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
Lary_Rock4 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
幺零九零零5 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络