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

题目要求:

  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("服务端已经退出~");
    }
}
相关推荐
文静小土豆1 小时前
Rocky Linux 二进制 安装K8S-1.35.0高可用集群
linux·运维·kubernetes
小技工丨1 小时前
华为TaiShan 200 2280 ARM服务器虚拟化部署完整指南
运维·服务器·arm开发
weixin_430750933 小时前
OpenMediaVault debian Linux安装配置企业私有网盘(三) 静态ip地址配置
linux·服务器·debian·nas·网络存储系统
403240733 小时前
[Jetson/Ubuntu 22.04] 解决挂载 exFAT 硬盘报错 “unknown filesystem type“ 及只读权限问题的终极指南
linux·运维·ubuntu
零意@3 小时前
debian如何把新编译的内核镜像替换原来的内核
运维·debian·更新内核版本·linux内核版本更新·debian更新内核
Love丶伊卡洛斯3 小时前
Ubuntu 部署 STUN服务端
linux·运维·ubuntu
有毒的教程5 小时前
SaltStack 开源自动化运维工具详细介绍
运维·开源·saltstack
大房身镇、王师傅5 小时前
【VirtualBox】VirtualBox 7.1.6 RockyLinux10 配置增强功能 设置共享目录
运维·服务器·virtualbox·rockylinux10
betazhou5 小时前
rsync使用案例分析
linux·运维·服务器·rsync·同步数据
SmartBrain5 小时前
Agent 知识总结
服务器·数据库·笔记