一.客户端通信工具类:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.net.SocketException;

import org.apache.commons.net.ftp.FTP;

import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPFile;

import org.apache.commons.net.ftp.FTPReply;

/*** 用于Android和FTP服务器进行交互的工具类*/

public class FTPUtils {

private FTPClient ftpClient = null;

private static FTPUtils ftpUtilsInstance = null;

private String ftpUrl;

private int ftpPort;

private String userName;

private String userPassword;

private final int connectTimeout = 5000;

private FTPUtils() {

ftpClient = new FTPClient();

}

/** 得到类对象实例(因为只能有一个这样的类对象,所以用单例模式)*/

public static FTPUtils getInstance() {

if (ftpUtilsInstance == null) {

ftpUtilsInstance = new FTPUtils();

}

return ftpUtilsInstance;

}

/*** 设置FTP服务器

*

*@paramFTPUrl

* FTP服务器ip地址

*@paramFTPPort

* FTP服务器端口号

*@paramUserName

* 登陆FTP服务器的账号

*@paramUserPassword

* 登陆FTP服务器的密码

*@return

*/

public boolean initFTPSetting(String FTPUrl, int FTPPort, String UserName,

String UserPassword) {

ftpUrl = FTPUrl;

ftpPort = FTPPort;

userName = UserName;

userPassword = UserPassword;

int reply;

try {

//设定连接超时时间

ftpClient.setConnectTimeout(connectTimeout);

//要连接的FTP服务器Url,Port

ftpClient.connect(FTPUrl, FTPPort);

//登陆FTP服务器

ftpClient.login(UserName, UserPassword);

//看返回的值是不是230,如果是,表示登陆成功

reply = ftpClient.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)) {

//断开

ftpClient.disconnect();

return false;

}

return true;

} catch (SocketException e) {

e.printStackTrace();

return false;

} catch (IOException e) {

e.printStackTrace();

return false;

}

}

/*** 断开FTP服务器*/

public boolean disconnectFTP(){

try {

ftpClient.disconnect();

return true;

} catch (IOException e) {

e.printStackTrace();

return false;

}

}

/*** 上传文件

*

*@paramFilePath

* 要上传文件所在SDCard的路径

*@paramFileName

* 要上传的文件的文件名(如:Sim唯一标识码)

*@returntrue为成功,false为失败*/

public boolean uploadFile(String FilePath, String FileName) {

if (!ftpClient.isConnected()) {

if (!initFTPSetting(ftpUrl, ftpPort, userName, userPassword)) {

return false;

}

}

try {

//设置存储路径//ftpClient.makeDirectory("/FtpFileTest");//ftpClient.changeWorkingDirectory("/FtpFileTest");//设置上传文件需要的一些基本信息

ftpClient.setBufferSize(1024);

ftpClient.setControlEncoding("UTF-8");

ftpClient.enterLocalPassiveMode();

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

//文件上传吧~

FileInputStream fileInputStream = new FileInputStream(FilePath);

ftpClient.storeFile(FileName, fileInputStream);

//关闭文件流

fileInputStream.close();

//退出登陆FTP,关闭ftpCLient的连接

ftpClient.logout();

ftpClient.disconnect();

} catch (IOException e) {

e.printStackTrace();

return false;

}

return true;

}

/*** 下载文件

*

*@paramFilePath

* 要存放的文件的路径

*@paramFileName

* 远程FTP服务器上的那个文件的名字

*@returntrue为成功,false为失败*/

public boolean downLoadFile(String FilePath, String FileName) {

if (!ftpClient.isConnected()) {

if (!initFTPSetting(ftpUrl, ftpPort, userName, userPassword)) {

return false;

}

}

try {

//转到指定下载目录

ftpClient.changeWorkingDirectory("/data");

//列出该目录下所有文件

FTPFile[] files = ftpClient.listFiles();

//遍历所有文件,找到指定的文件

for (FTPFile file : files) {

if (file.getName().equals(FileName)) {

//根据绝对路径初始化文件

File localFile = new File(FilePath);

//输出流

OutputStream outputStream = new FileOutputStream(localFile);

//下载文件

ftpClient.retrieveFile(file.getName(), outputStream);

//清除缓存

outputStream.flush();

//关闭流

outputStream.close();

}

}

//退出登陆FTP,关闭ftpCLient的连接

ftpClient.logout();

ftpClient.disconnect();

} catch (IOException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

return true;

}

}

二.利用Android设备作为FTP服务器,以下是FTPServer类

import java.io.File;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.apache.ftpserver.FtpServer;

import org.apache.ftpserver.FtpServerFactory;

import org.apache.ftpserver.ftplet.Authority;

import org.apache.ftpserver.ftplet.DefaultFtplet;

import org.apache.ftpserver.ftplet.FtpException;

import org.apache.ftpserver.ftplet.FtpRequest;

import org.apache.ftpserver.ftplet.FtpSession;

import org.apache.ftpserver.ftplet.Ftplet;

import org.apache.ftpserver.ftplet.FtpletResult;

import org.apache.ftpserver.ftplet.UserManager;

import org.apache.ftpserver.listener.ListenerFactory;

import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;

import org.apache.ftpserver.usermanager.SaltedPasswordEncryptor;

import org.apache.ftpserver.usermanager.impl.BaseUser;

import org.apache.ftpserver.usermanager.impl.WritePermission;

import android.os.Environment;

public class FtpServerlet extends DefaultFtplet{

private FtpServer mFtpServer;

private final int mPort = 2121;

private final String mDirectory = Environment.getExternalStorageDirectory().getPath() + "/FtpFileTest";

private final String mUser = "way";

private final String mPassword = "way";

private static FtpServerlet mInstance;

public static FtpServerlet getInstance(){

if(mInstance == null){

mInstance = new FtpServerlet();

}

return mInstance;

}

/*** FTP启动

*@throwsFtpException*/

public void start() throws FtpException {

if (null != mFtpServer && false == mFtpServer.isStopped()) {

return;

}

File file = new File(mDirectory);

if (!file.exists()) {

file.mkdirs();

}

FtpServerFactory serverFactory = new FtpServerFactory();

ListenerFactory listenerFactory = new ListenerFactory();

//设定端末番号

listenerFactory.setPort(mPort);

//通过PropertiesUserManagerFactory创建UserManager然后向配置文件添加用户

PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();

userManagerFactory.setPasswordEncryptor(new SaltedPasswordEncryptor());

UserManager userManager = userManagerFactory.createUserManager();

List auths = new ArrayList();

Authority auth = new WritePermission();

auths.add(auth);

//添加用户

BaseUser user = new BaseUser();

user.setName(mUser);

user.setPassword(mPassword);

user.setHomeDirectory(mDirectory);

user.setAuthorities(auths);

userManager.save(user);

//设定Ftplet

Map ftpletMap = new HashMap();

ftpletMap.put("Ftplet", this);

serverFactory.setUserManager(userManager);

serverFactory.addListener("default", listenerFactory.createListener());

serverFactory.setFtplets(ftpletMap);

//创建并启动FTPServer

mFtpServer = serverFactory.createServer();

mFtpServer.start();

}

/*** FTP停止*/

public void stop() {

//FtpServer不存在和FtpServer正在运行中

if (null != mFtpServer && false == mFtpServer.isStopped()) {

mFtpServer.stop();

}

}

@Override

public FtpletResult onAppendStart(FtpSession session, FtpRequest request)

throws FtpException, IOException {

System.out.println("onAppendStart");

return super.onAppendStart(session, request);

}

@Override

public FtpletResult onAppendEnd(FtpSession session, FtpRequest request)

throws FtpException, IOException {

System.out.println("onAppendEnd");

return super.onAppendEnd(session, request);

}

@Override

public FtpletResult onLogin(FtpSession session, FtpRequest request)

throws FtpException, IOException {

System.out.println("onLogin");

return super.onLogin(session, request);

}

@Override

public FtpletResult onConnect(FtpSession session) throws FtpException,

IOException {

System.out.println("onConnect");

return super.onConnect(session);

}

@Override

public FtpletResult onDisconnect(FtpSession session) throws FtpException,

IOException {

System.out.println("onDisconnect");

return super.onDisconnect(session);

}

@Override

public FtpletResult onUploadStart(FtpSession session, FtpRequest request)

throws FtpException, IOException {

System.out.println("onUploadStart");

return super.onUploadStart(session, request);

}

@Override

public FtpletResult onUploadEnd(FtpSession session, FtpRequest request)

throws FtpException, IOException {

String FtpUploadPath = mDirectory + "/" + request.getArgument();

//接收到文件后立即删除

File uploadFile = new File(FtpUploadPath);

uploadFile.delete();

return super.onUploadEnd(session, request);

}

}

三.客户端和服务器的AndroidManifest中添加相关权限

四.所需jar包

commons-net-3.0.1.jar

ftpserver-core-1.0.6.jar

找了半天不知道怎么上传附件,只能麻烦大家自己去下载了。

android 检测网络ftp,Android端与Android端利用WIFI进行FTP通信相关推荐

  1. Android检测网络是否正常代码!

    在Android开发中,如果该应用程序需要连接网络请求,那么最好我们先做一个检测网络是否在线的判断,否则程序容易出现卡死或FC等Bug,应该判断如果手机离线则弹出提示让用户检查网络,如果正常则继续执行 ...

  2. Android检测网络变化---断网弹窗提示

    一.首先,创建一个类继承BroadcastReceiver,重写onReceive 方法 (一)断网弹出的dialog提示弹窗 在onReceive方法中添加操作代码 创建一个IntentReceiv ...

  3. Android检测网络状态监听网络变化

    网络状态改变.用户信息改变(帐户的钱),第一时间就要想到用观察者模式来实现 广播接收者,简单地把网络的变化通过接口抛出去 package com.qkt.face.et.receiver;import ...

  4. android wifi是否可用,Android检测网络连接是否可用

    同时检查Wi-fi和移动互联网- private boolean haveNetworkConnection() { boolean haveConnectedWifi = false; boolea ...

  5. android检测两个app相似度,Android应用相似性检测研究

    摘要: Android平台的应用种类繁多,数量庞大,其中不乏将正版应用的代码和资源文件稍作修改而成的盗版应用,这些盗版应用给Android的应用市场带来了不少挑战.面对这些盗版应用,现有的检测手段普遍 ...

  6. android访问网络提示 服务不可用,Android系统服务不可用

    我打算从我的网站获取数据,然后将该信息放入微调器中.我用一些教程,我想出了这个代码Android系统服务不可用 package com.thenewboston.christian; import j ...

  7. android 首选网络类型,如何在adb android上更改首选网络类型? - 程序园

    这适用于我的设备: adb shell sqlite3 /data/data/com.android.providers.settings/databases/settings.db "up ...

  8. python ftp 文件修改时间_如何利用pythonftplib获取FTP文件的修改时间

    MLST或MDTM 虽然可以使用MLST或MDTM命令通过FTP检索单个文件的时间戳,但ftplib不支持这两种命令. 当然,您可以使用^{}自己实现MLST或MDTM. 见: MDTM的一个简单示例 ...

  9. 利用Fiddler对Android手机网络请求进行抓包

    在Android的开发调试过程中,特别是针对网络编程的情况,很多时候我们希望能够对Android的网络请求进行抓包,用来定位以及分析我们程序的问题.下面我介绍使用Fiddler对Android模拟器的 ...

最新文章

  1. PyTorch关键算法疑似侵权,Facebook被起诉
  2. Python.h: No such file or directory
  3. c# response输出文件实例(14)
  4. Scala调用Java静态成员及静态方法注意点——只能通过当前类名调用而不能借助子类调用父类静态成员/方法
  5. 计算机在平面设计上的应用,计算机平面设计中设计软件的应用平面设计论文(word版)...
  6. App设计灵感之十二组精美的旅行App设计案例
  7. CentOS下ZooKeeper单机模式、集群模式安装
  8. 国家开放大学2021春1073法律文书答案
  9. matlab数据接口技术,matlab接口技术与应用
  10. python和abap的关系_ABAP 一对多关系
  11. sqlserver执行更新语句时出现异常,t 附近有语法错误
  12. 【转】OUTLOOK签名档中加入写信日期
  13. Mac 原生词典扩展词库
  14. 禁用某个程序,试试镜像劫持吧!
  15. 在线翻译_英汉互译,支持繁体,韩语,日语 - 微信小程序在线翻译,单词句子翻译
  16. 快狗打车CTO沈剑:怕什么技术无穷尽?进一寸有一寸的欢喜
  17. 整合SSM中jsp页面图片加载不出来问题
  18. 电脑如何安装无线网卡?
  19. [博弈论]移棋子游戏
  20. 华为qq邮箱服务器密码忘了,华为自带的电子邮件APP怎么用?一招教你快速登录QQ/网易邮箱...

热门文章

  1. java 编辑二进制文件_java写二进制文件,不能直接编辑,该怎么操作?
  2. ubuntu 以太网已连接但是无法联网_连接wifi时,出现“已连接但无法访问互联网”,这样做就可以了...
  3. 软件portable
  4. Spring Cloud 启动Eureka的Client(客户端)时,项目一启动就停止,控制台无任何报错信息
  5. linux 高性能日志,linux日志系统
  6. php sizeof函数,sizeof()的简单介绍
  7. sklearn逻辑回归参数设置_【机器学习笔记】:逻辑回归实战练习(二)
  8. iPhone黑屏幕转圈圈(解决办法)
  9. Feign Client 原理和使用
  10. Android开发笔记(一百一十六)网络学习资源