java使用Socket实现TCP协议的excel文件从服务器上传和下载到本机的开发实现 分别在上传前,基于字符流将的文件读取和下载后,基于字符流的文件写入存储把代码写全
时间: 2024-10-10 18:02:34 浏览: 36
Java通过 Socket 实现 TCP服务端
5星 · 资源好评率100%
在Java中使用Socket实现TCP协议上传和下载Excel文件涉及到两个主要步骤:文件传输的编码处理以及Server和Client端的编写。这里提供一个基础的示例,假设我们使用UTF-8编码,并假设文件路径已知:
### Server端 (接收Excel文件上传)
```java
import java.io.*;
import java.net.*;
public class FileServer {
private static final int PORT = 9000;
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(PORT);
System.out.println("Server started on port " + PORT);
try (Socket client = server.accept()) {
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
String fileName = ""; // 获取文件名的方式取决于客户端如何发送
// 接收文件名
ByteArrayOutputStream baosFileName = new ByteArrayOutputStream();
while ((bytesRead = in.read(buffer)) != -1) {
baosFileName.write(buffer, 0, bytesRead);
}
fileName = new String(baosFileName.toByteArray(), StandardCharsets.UTF_8);
// 检查文件是否存在并创建输出目录
File file = new File(fileName);
if (!file.exists()) {
System.err.println("File not found");
return;
}
// 打开文件以供输出流写入
FileInputStream fis = new FileInputStream(file);
byte[] fileContent = new byte[(int) file.length()];
fis.read(fileContent);
// 发送文件大小
out.writeInt(fileContent.length);
// 写入文件内容
out.write(fileContent);
fis.close();
out.flush();
client.close();
} finally {
server.close();
}
}
}
```
### Client端 (下载Excel文件)
```java
import java.io.*;
import java.net.*;
public class FileClient {
private static final String SERVER_ADDRESS = "localhost";
private static final int PORT = 9000;
public static void main(String[] args) throws IOException {
Socket socket = new Socket(SERVER_ADDRESS, PORT);
try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);) {
// 发送请求文件名
out.println("requesting file");
// 读取文件名响应
String fileName = in.readLine();
System.out.println("File name received: " + fileName);
// 读取文件长度
int fileSize = Integer.parseInt(in.readLine());
// 创建缓冲区和文件
byte[] buffer = new byte[fileSize];
File outputFile = new File(fileName);
// 接收文件内容
in.read(buffer, 0, fileSize);
FileOutputStream fos = new FileOutputStream(outputFile);
fos.write(buffer);
fos.close();
in.close();
out.close();
} finally {
socket.close();
}
}
}
```
以上代码是简化的版本,实际应用中可能需要添加错误处理、文件分割传输等复杂逻辑。同时,为了安全性和效率,你可能还需要考虑使用更高级的框架如NIO或者HTTP协议替代原始套接字。
阅读全文