题目要求:
- 编写客户端程序和服务器端程序
- 客户端可以输入一个音乐 文件名,比如 美丽中国,服务端 收到音乐后,可以给客户端返回这个音乐文件,如果服务器没有这个文件,返回一个默认的音乐即可
- 客户端收到文件后,保存到本地E:\\
- 提示:该程序可以使用工具类StreamUtils.java
这是工具类StreamUtils.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*/
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已经关闭~");}
}
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//如果客户下载的是高山流水 我们就返回该文件 ,否则一律返回 无名.mp3String 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("服务端已经退出~");}
}