安卓 ftp服务器 源码
时间: 2023-07-28 08:10:49 浏览: 49
以下是一个基于 Java 的 Android FTP 服务器的示例代码:
```java
import android.os.Environment;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class FtpServer implements Runnable {
private int port;
private boolean running;
private ServerSocket serverSocket;
private String rootDir;
public FtpServer(int port) {
this.port = port;
this.running = false;
this.rootDir = Environment.getExternalStorageDirectory().getAbsolutePath();
}
@Override
public void run() {
try {
serverSocket = new ServerSocket(port);
running = true;
System.out.println("FTP Server started on port " + port);
while (running) {
Socket clientSocket = serverSocket.accept();
System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress());
FtpClientHandler clientHandler = new FtpClientHandler(clientSocket, rootDir);
new Thread(clientHandler).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void stop() {
running = false;
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private class FtpClientHandler implements Runnable {
private Socket clientSocket;
private String rootDir;
public FtpClientHandler(Socket clientSocket, String rootDir) {
this.clientSocket = clientSocket;
this.rootDir = rootDir;
}
@Override
public void run() {
try {
BufferedInputStream in = new BufferedInputStream(clientSocket.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(clientSocket.getOutputStream());
out.write("220 Service ready for new user.\r\n".getBytes());
out.flush();
byte[] buffer = new byte[1024];
int bytesRead;
String command = "";
while ((bytesRead = in.read(buffer)) != -1) {
String request = new String(buffer, 0, bytesRead);
System.out.print(request);
if (request.trim().equals("QUIT")) {
out.write("221 Goodbye.\r\n".getBytes());
out.flush();
break;
} else if (request.startsWith("USER ")) {
out.write("331 User name okay, need password.\r\n".getBytes());
out.flush();
} else if (request.startsWith("PASS ")) {
out.write("230 User logged in, proceed.\r\n".getBytes());
out.flush();
} else if (request.startsWith("PWD")) {
out.write(("257 \"" + rootDir + "\" is the current directory.\r\n").getBytes());
out.flush();
} else if (request.startsWith("CWD ")) {
String[] tokens = request.split(" ");
String dir = tokens[1];
File newDir = new File(rootDir + "/" + dir);
if (newDir.exists() && newDir.isDirectory()) {
rootDir = newDir.getAbsolutePath();
out.write(("250 Changed to directory \"" + rootDir + "\"\r\n").getBytes());
out.flush();
} else {
out.write("550 Failed to change directory.\r\n".getBytes());
out.flush();
}
} else if (request.startsWith("LIST")) {
File dir = new File(rootDir);
File[] files = dir.listFiles();
StringBuilder response = new StringBuilder();
for (File file : files) {
String name = file.getName();
String type = file.isDirectory() ? "d" : "-";
String size = String.valueOf(file.length());
response.append(type).append("rw-r--r-- 1 owner group ").append(size).append(" Jan 01 00:00 ").append(name).append("\r\n");
}
out.write(("150 Opening data connection for directory list\r\n").getBytes());
out.flush();
Socket dataSocket = new Socket(clientSocket.getInetAddress(), 20);
BufferedOutputStream dataOut = new BufferedOutputStream(dataSocket.getOutputStream());
dataOut.write(response.toString().getBytes());
dataOut.flush();
dataOut.close();
dataSocket.close();
out.write("226 Directory send OK.\r\n".getBytes());
out.flush();
} else if (request.startsWith("RETR ")) {
String[] tokens = request.split(" ");
String fileName = tokens[1];
File file = new File(rootDir + "/" + fileName);
if (file.exists() && file.isFile()) {
out.write(("150 Opening data connection for " + fileName + "\r\n").getBytes());
out.flush();
Socket dataSocket = new Socket(clientSocket.getInetAddress(), 20);
BufferedOutputStream dataOut = new BufferedOutputStream(dataSocket.getOutputStream());
BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream(file));
byte[] fileBuffer = new byte[1024];
int fileBytesRead;
while ((fileBytesRead = fileIn.read(fileBuffer)) != -1) {
dataOut.write(fileBuffer, 0, fileBytesRead);
dataOut.flush();
}
fileIn.close();
dataOut.close();
dataSocket.close();
out.write("226 Transfer complete.\r\n".getBytes());
out.flush();
} else {
out.write(("550 Failed to open file " + fileName + "\r\n").getBytes());
out.flush();
}
} else {
out.write("502 Command not implemented.\r\n".getBytes());
out.flush();
}
buffer = new byte[1024];
}
clientSocket.close();
System.out.println("Client disconnected.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
此代码实现了一个简单的 FTP 服务器,支持用户登录、切换目录、列出文件列表、下载文件等基本功能。请注意,此代码仅供参考,实际使用时需要进行适当修改和优化。