1. Java C-S 模式实现文件的网络传输,从客户端上传文件到服务器端,服务器端接收文件并下载保存到本地,反馈消息给客户端
客户端
package upload;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class Client {
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 fileSize = 0;
File filePath = new File("C:\\Users\\Admin\\Desktop\\fishing.jpg");
int readLen;
byte[] buf = new byte[1024];
byteArrayOutputStream = new ByteArrayOutputStream();
bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath));
System.out.println("文件读入中···");
while ((readLen = bufferedInputStream.read(buf)) != -1) {
byteArrayOutputStream.write(buf, 0, readLen);
fileSize += readLen;
}
System.out.println("文件读入成功,文件大小为:" + fileSize + " bytes!");
byte[] fileByteArray = byteArrayOutputStream.toByteArray();
socket = new Socket(InetAddress.getLocalHost(), 6666);
outputStream = socket.getOutputStream();
System.out.println("文件发送到服务器中···");
outputStream.write(fileByteArray);
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 {
bufferedReader.close();
inputStream.close();
outputStream.close();
byteArrayOutputStream.close();
bufferedInputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务端
package upload;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
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();
long fileSize = 0;
File fileSavePath = new File("C:\\Users\\Admin\\Desktop\\temp.jpg");
int readLen;
byte[] buffer = new byte[1024];
inputStream = socket.getInputStream();
byteArrayOutputStream = new ByteArrayOutputStream();
System.out.println("文件读取中···");
while ((readLen = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, readLen);
fileSize += readLen;
}
System.out.println("文件读取成功,总大小为 " + fileSize + " bytes!");
byte[] fileByteArray = byteArrayOutputStream.toByteArray();
System.out.println("文件保存到本地中···");
bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(fileSavePath));
bufferedOutputStream.write(fileByteArray);
System.out.println("文件保存到本地成功!保存路径为:" + fileSavePath);
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 {
bufferedWriter.close();
outputStream.close();
bufferedOutputStream.close();
byteArrayOutputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2. 客户端发出下载文件请求,服务端响应客户端请求并将文件发送给客户端,客户端接收服务端发送的文件并下载保存到本地
客户端
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class FileClient {
byte[] fileData = null;
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
BufferedOutputStream bufferedOutputStream = null;
Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
FileClient client = new FileClient();
try {
client.socket = new Socket(InetAddress.getLocalHost(), 9999);
client.sendFileNameToServer();
client.receiveFileData();
client.saveFile();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
client.socket.close();
client.inputStream.close();
client.outputStream.close();
client.bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void sendFileNameToServer() {
try {
System.out.print("请输入您想要下载的文件名(含文件拓展名):");
String choice = scanner.next();
outputStream = socket.getOutputStream();
outputStream.write(choice.getBytes(StandardCharsets.UTF_8));
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}
}
public void receiveFileData() {
try {
int readLen = 0;
byte[] buf = new byte[1024];
inputStream = socket.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
System.out.println("正在接收服务器传输的文件···");
while ((readLen = inputStream.read(buf)) != -1) {
byteArrayOutputStream.write(buf, 0, readLen);
}
socket.shutdownInput();
fileData = byteArrayOutputStream.toByteArray();
System.out.println("文件接收成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public void saveFile() {
try {
bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Admin\\Desktop\\temp.jpg"));
System.out.println("正在将文件保存到本地···");
bufferedOutputStream.write(fileData);
System.out.println("文件保存到本地完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class FileServer {
byte[] fileData = null;
String requestFileName = null;
ArrayList<String> fileNameList = new ArrayList<>();
File filePath = new File("C:\\Users\\Admin\\Desktop\\sourceFile");
Socket socket = null;
ServerSocket serverSocket = null;
InputStream inputStream = null;
BufferedInputStream bufferedInputStream = null;
public static void main(String[] args) {
FileServer server = new FileServer();
server.createAndReadFiles();
server.startServer();
server.receiveRequestNameFromClient();
server.readFileFromDisk();
server.transferFileToClient();
try {
server.socket.close();
server.serverSocket.close();
server.inputStream.close();
server.bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void createAndReadFiles() {
System.out.println("正在进行文件夹初始化···");
if (!(filePath.exists() && filePath.isDirectory())) {
filePath.mkdirs();
}
File[] files = filePath.listFiles();
for (File file : files) {
if (file.isFile()) {
fileNameList.add(file.getName());
}
}
System.out.println("初始化完成!");
}
public void startServer() {
try {
serverSocket = new ServerSocket(9999);
System.out.println("服务器已启动,等待连接···");
socket = serverSocket.accept();
System.out.println("服务端 - 客户端建立连接成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public void receiveRequestNameFromClient() {
try {
int readLen;
byte[] buf = new byte[2048];
inputStream = socket.getInputStream();
System.out.println("正在接收客户端请求的文件名···");
while ((readLen = inputStream.read(buf)) != -1) {
requestFileName = new String(buf, 0, readLen);
}
socket.shutdownInput();
System.out.println("成功接收到客户端请求的文件名!");
} catch (IOException e) {
e.printStackTrace();
}
}
public void readFileFromDisk() {
try {
int readLen = 0;
byte[] buf = new byte[1024];
File requestFile = new File(filePath + "\\" + requestFileName);
bufferedInputStream = new BufferedInputStream(new FileInputStream(requestFile));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
System.out.println("正在从磁盘读取文件···");
while ((readLen = bufferedInputStream.read(buf)) != -1) {
byteArrayOutputStream.write(buf, 0, readLen);
}
fileData = byteArrayOutputStream.toByteArray();
System.out.println("从磁盘读取文件完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
public void transferFileToClient() {
try {
System.out.println("正在传送文件到客户端···");
OutputStream outputStream1 = socket.getOutputStream();
outputStream1.write(fileData);
System.out.println("文件传输到客户端完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}