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

题目要求:

  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("服务端已经退出~");
    }
}
相关推荐
Brilliantwxx1 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
不怕犯错,就怕不做1 小时前
git prune 自动删除本地记录中那些远程已经不存在的分支引用
linux·服务器·git
richdata2 小时前
商品数字化不是先做大数据,而是先把数据变成可用决策
大数据·运维·数据治理·商品数字化·智能补货·ai商品决策
weixin_416667962 小时前
【无标题】
运维·服务器·网络
一池秋_3 小时前
arm低配linux设备,桌面应用冷启动提速方法
linux·运维·arm开发
上海云盾-小余5 小时前
流量攻击复盘:为什么 WAF 完好,业务依旧瘫痪
运维·服务器·网络
IT大白鼠5 小时前
Docker 私有仓库管理:Harbor 企业级仓库搭建与镜像全生命周期管理
运维·docker·容器
戴西软件5 小时前
戴西iDWS.3DViz Suite数据轻量化可视化软件,从传统桌面软件向云端协同的重大突破
大数据·运维·网络·人工智能·机器学习·3d
我命由我123456 小时前
Linux - Linux/POSIX 路径斜杠折叠规则
linux·运维·服务器·android studio·android jetpack·android-studio·android runtime
姚不倒6 小时前
Nginx 反向代理:5 种负载均衡策略与实战
运维·nginx·负载均衡