题目要求:
- 编写客户端程序和服务器端程序
- 客户端可以输入一个音乐 文件名,比如 美丽中国,服务端 收到音乐后,可以给客户端返回这个音乐文件,如果服务器没有这个文件,返回一个默认的音乐即可
- 客户端收到文件后,保存到本地E:\\
- 提示:该程序可以使用工具类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("服务端已经退出~");
}
}