怎么用java实现TCP多线程传输文件
时间: 2023-11-11 22:02:35 浏览: 143
实现TCP多线程传输文件可以分为以下步骤:
1. 创建一个ServerSocket,监听客户端的连接请求。
2. 当有客户端连接时,创建一个新的线程来处理客户端的请求。
3. 在新的线程中,创建一个Socket与客户端进行通信。
4. 通过Socket获取输入输出流,进行文件的读写。
5. 将文件分成多个块,每个块单独发送,接收方将块合并成完整文件。
下面是一个示例代码,实现了TCP多线程传输文件:
```java
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
try {
// 创建ServerSocket,监听客户端的连接请求
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器启动,等待客户端连接...");
while (true) {
// 当有客户端连接时,创建一个新的线程来处理客户端的请求
Socket clientSocket = serverSocket.accept();
System.out.println("客户端 " + clientSocket.getInetAddress().getHostAddress() + " 连接成功");
Thread thread = new Thread(new ClientHandler(clientSocket));
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 处理客户端请求的线程
static class ClientHandler implements Runnable {
private Socket clientSocket;
public ClientHandler(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try {
// 通过Socket获取输入输出流
DataInputStream dis = new DataInputStream(clientSocket.getInputStream());
DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream());
// 读取客户端传来的文件名和大小
String fileName = dis.readUTF();
long fileSize = dis.readLong();
System.out.println("客户端传来的文件名:" + fileName);
System.out.println("客户端传来的文件大小:" + fileSize + " 字节");
// 创建文件输出流,将文件写入到服务器端指定目录
FileOutputStream fos = new FileOutputStream("/path/to/save/" + fileName);
// 将文件分成多个块,每个块单独发送
byte[] buffer = new byte[1024];
int len;
while ((len = dis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
// 关闭流
fos.close();
dis.close();
dos.close();
clientSocket.close();
System.out.println("文件接收成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
客户端代码如下:
```java
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
try {
// 创建Socket,连接服务器
Socket socket = new Socket("localhost", 8888);
System.out.println("连接服务器成功");
// 通过Socket获取输入输出流
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
// 读取本地文件,将文件名和大小发送给服务器
File file = new File("/path/to/file");
String fileName = file.getName();
long fileSize = file.length();
dos.writeUTF(fileName);
dos.writeLong(fileSize);
System.out.println("文件名:" + fileName);
System.out.println("文件大小:" + fileSize + " 字节");
// 创建文件输入流,将文件发送给服务器
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
dos.write(buffer, 0, len);
}
// 关闭流
fis.close();
dis.close();
dos.close();
socket.close();
System.out.println("文件发送成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
在这个示例代码中,服务器和客户端都是单线程的,每次只能处理一个客户端请求。如果需要支持多个客户端同时连接,可以使用线程池来管理多个线程,每个线程负责处理一个客户端请求。
阅读全文