Android之FTP服务器优化

相信那个大名鼎鼎的开源项目SwiFTP大家都用过。但是,我发现那个项目从2010年发布后就从没有维护过,有些bug也没有修复,最近比较闲,就好好的整改了一番,算是完成了初期的目标,修复了上传中文文件到服务器时会出错的bug,把那个丑得一B的界面完全换掉了,由于今天刚刚完成,只测试了一部分功能,可能会引入一些bug,敬请谅解,好了,废话不说,我们来看看经过大修的效果图,最大的特点是:返回Activity时可以手势拖动,个人很喜欢这个效果,仿IOS7.0。

20131029上传V1.0.0代码:http://download.csdn.net/detail/weidi1989/6473503

开源中国地址(欢迎fork):http://git.oschina.net/way/FTPServer

1.主界面,没有任何其他花哨的东西,很简洁。

2.引入侧边栏菜单,将简单的设置选项放在这里,很方便。

3.关于界面。

4.关于界面是一个Activity,我在这里引入了手势返回上一个Activity的效果,完全可以解放了返回键。

5.帮助菜单。

6.选择FTP服务器开发目录路径界面。

7.浏览器访问服务器截图

8.我的电脑地址栏访问服务器截图

  


  


  


 

OK,由于功能方面改动较少,界面方面技术含量不高,我就不细说了,想了解更多的朋友可以下载源代码,如果有问题或好的建议,欢迎给我留言或者邮件我,谢谢!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
以下是一个基于 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 服务器,支持用户登录、切换目录、列出文件列表、下载文件等基本功能。请注意,此代码仅供参考,实际使用时需要进行适当修改和优化
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值