在Java中,使用Socket套接字实现文件传输主要涉及两个步骤:服务器端接收文件和客户端发送文件。下面是一个简单的示例,展示了如何使用Java Socket套接字实现文件传输。
import java.io.*;
import java.net.*;
public class FileServer {
public static void main(String[] args) {
int port = 12345;
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Server is listening on port " + port);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("New client connected");
new FileTransferHandler(socket).start();
}
} catch (IOException e) {
System.out.println("Server exception: " + e.getMessage());
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
public class FileTransferHandler extends Thread {
private Socket socket;
public FileTransferHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream input = socket.getInputStream();
DataInputStream dataInput = new DataInputStream(input);
String fileName = dataInput.readUTF();
long fileSize = dataInput.readLong();
System.out.println("Receiving file: " + fileName + ", size: " + fileSize);
FileOutputStream output = new FileOutputStream(fileName);
BufferedOutputStream bufferedOutput = new BufferedOutputStream(output);
byte[] buffer = new byte[4096];
int bytesRead;
long totalBytesRead = 0;
while (totalBytesRead < fileSize && (bytesRead = dataInput.read(buffer, 0, (int) Math.min(buffer.length, fileSize - totalBytesRead))) != -1) {
bufferedOutput.write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
}
bufferedOutput.close();
output.close();
System.out.println("File received: " + fileName);
socket.close();
} catch (IOException e) {
System.out.println("File transfer error: " + e.getMessage());
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
public class FileClient {
public static void main(String[] args) {
String serverAddress = "localhost";
int port = 12345;
String filePath = "example.txt";
try (Socket socket = new Socket(serverAddress, port)) {
System.out.println("Connected to server");
FileInputStream fileInput = new FileInputStream(filePath);
DataOutputStream dataOutput = new DataOutputStream(socket.getOutputStream());
File file = new File(filePath);
String fileName = file.getName();
long fileSize = file.length();
dataOutput.writeUTF(fileName);
dataOutput.writeLong(fileSize);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fileInput.read(buffer)) != -1) {
dataOutput.write(buffer, 0, bytesRead);
}
dataOutput.flush();
System.out.println("File sent: " + fileName);
fileInput.close();
socket.close();
} catch (IOException e) {
System.out.println("File transfer error: " + e.getMessage());
e.printStackTrace();
}
}
}
在这个示例中,服务器端监听指定端口,等待客户端连接。当客户端连接时,服务器端创建一个FileTransferHandler线程来处理文件传输。客户端连接到服务器,发送文件名和文件大小,然后将文件内容发送给服务器。
注意:这个示例仅用于演示目的,实际应用中可能需要考虑更多的错误处理和优化。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。