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

题目要求:

  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("服务端已经退出~");
    }
}
相关推荐
lifeng43218 分钟前
Jenkins集成部署(图文教程、超级详细)
运维·jenkins
白手小弟1 小时前
python wxauto库实现微信自动化发送信息、回复、添加好友等
运维·自动化
ii_best1 小时前
ios按键精灵自动化的脚本教程:自动点赞功能的实现
运维·ios·自动化
3DVisionary1 小时前
数字图像相关DIC技术用于机械臂自动化焊接全场变形测量
运维·数码相机·自动化·焊接变形实验·数字图像相关dic技术·自动化焊接全场变形测量·非接触高精度环境适应性全场测量
小伍_Five1 小时前
透视网络世界:计算机网络习题的深度解析与总结【前3章】
服务器·网络·计算机网络
芷栀夏1 小时前
如何在任何地方随时使用本地Jupyter Notebook无需公网IP
服务器·ide·tcp/ip·jupyter·ip
G鲲鹏展翅Y1 小时前
jupyter-lab与实验室服务器远程链接
服务器·jupyter
IT机器猫2 小时前
Docker完整技术汇总
运维·docker·容器
无所不在的物质2 小时前
Jenkins基础教程
运维·云原生·自动化·jenkins
一休哥助手2 小时前
全面解析 Linux 系统监控与性能优化
linux·运维·性能优化