Java C-S 模式实现文件的网络传输,从客户端发送文件到服务器端,服务器端接收文件下载保存到本地并反馈消息给客户端。
- 客户端:
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class FileSendClient {
public static void main(String[] args) {
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
BufferedReader bufferedReader = null;
BufferedInputStream bufferedInputStream = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
// 读取到的字节数
int readLen;
// 文件大小
int fileSize = 0;
// 字节缓冲数组,加快文件读取速度
byte[] buffer = new byte[1024];
// 文件路径
File filePath = new File("C:\Users\Admin\Desktop\BeFree.jpg");
// 创建字节输出流,保存从文件读取到的二进制数据
byteArrayOutputStream = new ByteArrayOutputStream();
// 文件输入流
bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath));
// 读取图片文件中的二进制内容,并将内容写进字节数组输出流
System.out.println("文件读入中···");
while ((readLen = bufferedInputStream.read(buffer)) != -1) {
// 将从文件读取到的二进制数据写进字节数组输出流(byteArrayOutputStream)
byteArrayOutputStream.write(buffer, 0, readLen);
fileSize += readLen;
}
System.out.println("文件读入成功,文件大小为:" + fileSize + " bytes!");
// 将得到的 byteArrayOutputStream 转换为一个字符数组
byte[] array = byteArrayOutputStream.toByteArray();
// 与服务器端建立连接
socket = new Socket(InetAddress.getLocalHost(), 6666);
// 获取输出流,将图片字节数组发送到服务器端
outputStream = socket.getOutputStream();
System.out.println("文件发送到服务器中···");
outputStream.write(array);
// 写入结束标志
socket.shutdownOutput();
System.out.println("文件发送到服务器成功!");
// 接送服务器端发送的反馈信息并打印
System.out.print("接收到的服务器信息:");
inputStream = socket.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
System.out.println(bufferedReader.readLine());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
inputStream.close();
outputStream.close();
bufferedReader.close();
bufferedInputStream.close();
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 服务器端:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class FileReceiveServer {
public static void main(String[] args) {
Socket socket = null;
InputStream inputStream = null;
ServerSocket serverSocket = null;
OutputStream outputStream = null;
BufferedWriter bufferedWriter = null;
ByteArrayOutputStream byteArrayOutputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
// 监听端口,等待连接
serverSocket = new ServerSocket(6666);
System.out.println("服务器已启动,等待连接···");
socket = serverSocket.accept();
// 读取到的字节数
int readLen;
// 文件大小,单位为字节
long fileSize = 0;
// 缓冲字节数组,加快读取数组
byte[] buffer = new byte[1024];
// 获得输出流,从输入流中读取客户端发送过来的二进制数组信息
inputStream = socket.getInputStream();
// 字节数组输出流,保存从 inputStream 依次读出到的二进制数据
byteArrayOutputStream = new ByteArrayOutputStream();
// 从 inputStream 中读取数据
System.out.println("文件读取中···");
// 读取 inputStream 中的数据,并将数据写进 byteArrayOutputStream
while ((readLen = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, readLen);
fileSize += readLen;
}
System.out.println("文件读取成功,总大小为 " + fileSize + " bytes!");
// 将 byteArrayOutputStream 中的数据转换为字节数组(文件二进制数据)
byte[] array = byteArrayOutputStream.toByteArray();
// 将最终得到的字节数组写进文件
File filePath = new File("C:\Users\Admin\Desktop\temp.jpg");
System.out.println("文件保存到本地中···");
bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(filePath));
bufferedOutputStream.write(array);
System.out.println("文件保存到本地成功!保存路径为:" + filePath);
// 向客户端反馈文件下载保存成功信息
outputStream = socket.getOutputStream();
bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
System.out.print("发送反馈信息到客户端··· ");
bufferedWriter.write("文件接收成功,下载保存完成!");
bufferedWriter.newline();
bufferedWriter.flush();
System.out.println("消息发送成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
inputStream.close();
outputStream.close();
serverSocket.close();
bufferedWriter.close();
byteArrayOutputStream.close();
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}



