这里使用的将数据全部读取成byte数组 然后进行传输
服务器端:
package com.sofwin.socket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @packageName: com.sofwin.socket
* @author: wentao
* @date: 2022/11/14 15:50
* @version: 1.0
* @email 1660420659@qq.com
* @description: 文件下载 服务端
*/
public class FileDownloadServer {
public static void main(String[]args) throws IOException {
//1.监听8888端口 等待客户端连接,并读取客户端发送下载文件的名字
ServerSocket serverSocket = new ServerSocket(8888);
//2.等待客户端连接
System.out.println("服务端等待客户端进行连接");
Socket socket = serverSocket.accept();
System.out.println("连接成功");
//3.读取客户端发送要下载的文件名 字符流读取
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String data;
//规定只是输入一行
data = bufferedReader.readLine();
System.out.println("要下载的文件名称为:"+ data);
//服务器中有 高山流水 和 无名 两个音乐
if ("高山流水.mp3".equals(data)) {
data = "springboot_01_01test\\src\\main\\java\\高山流水.mp3";
}else {
data = "springboot_01_01test\\src\\main\\java\\无名.mp3";
}
BufferedInputStream inputStream1 = new BufferedInputStream(new FileInputStream(data));
//5.使用工具类读取文件到字节数组中
byte[] bytes = SystemUtils.streamToByteArray(inputStream1);
//6.将字节数组
BufferedOutputStream outputStream = new BufferedOutputStream(socket.getOutputStream());
outputStream.write(bytes);
socket.shutdownOutput(); //结束标志
outputStream.flush();
//关闭相关资源
outputStream.close();
inputStream1.close();
bufferedReader.close();
socket.close();
serverSocket.close();
System.out.println("服务端退出");
}
}
客户端:
package com.sofwin.socket;
import org.springframework.util.StringUtils;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* @packageName: com.sofwin.socket
* @author: wentao
* @date: 2022/11/14 15:50
* @version: 1.0
* @email 1660420659@qq.com
* @description: 文件下载 客户端
*/
public class FileDownloadClient {
public static void main(String[]args) throws IOException {
//1.接受用户输入 指定下载文件名
Scanner scanner = new Scanner(System.in);
System.out.println("请输入下载文件名");
String downLoadFileName = scanner.next();
//2.连接服务端
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
//3.将高尚流水打入到
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write(downLoadFileName);
bufferedWriter.newLine();
bufferedWriter.flush();
//4.将读取字节数据
BufferedInputStream inputStream = new BufferedInputStream(socket.getInputStream());
byte[] bytes = SystemUtils.streamToByteArray(inputStream);
//5.将文件写入到系统中
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("f:\\"+downLoadFileName));
outputStream.write(bytes);
//6.关闭
outputStream.close();
inputStream.close();
bufferedWriter.close();
socket.close();
System.out.println("客户端下载完毕 正确退出");
}
}
工具类:
package com.sofwin.socket;
import java.io.*;
/**
* @packageName: com.sofwin.socket
* @author: wentao
* @date: 2022/11/14 16:04
* @version: 1.0
* @email 1660420659@qq.com
* @description: TODO
*/
public class SystemUtils {
public static byte[] streamToByteArray(InputStream is) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int len ;
while ((len = is.read(bytes)) != -1) {
byteArrayOutputStream.write(bytes,0,len);
}
return byteArrayOutputStream.toByteArray();
}
/**
* 将InputStream 转换成String
* @param is
* @return
* @throws IOException
*/
public static String streamToString(InputStream is) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) !=null) {
stringBuilder.append(line+"\r\n");
}
return stringBuilder.toString();
}
}