多线程,断点续传,局域网文件传输
传输协议说明
可继承这个类做相关的自定义配置
| 方法 | 默认值 | 说明 |
|---|---|---|
Boolean isDebug() |
true |
决定是否打印报错日志 |
String stringEncode() |
"utf-8" |
默认编码 |
String hostName() |
本机localhost名称 |
获取自己名称(暂时没用到) |
Integer commandPort() |
8736 |
命令通信的socket端口 |
Integer sendFilePort() |
9082 |
文件发送的socket端口 |
Integer sendFileTaskThreadCount() |
5 |
发送一个文件用多少个线程 |
Integer sendFileTaskMaxCount() |
3 |
一次性最多发送几个文件 |
String saveFilePath() |
D:\FileTransmissionCache |
默认文件接收保存路径 |
Integer sendFileUpdateFrequency() |
1000 |
发送文件的时候,回调更新的频率 |
所有的回调方法都会经过这个方法间接执行
public class TransmissionScheduler {
public void run(Runnable scheduler) {
scheduler.run();
}
}针对不同平台的适配
| 方法 | 默认值 | 说明 |
|---|---|---|
Boolean isMainThread() |
判断是否在创建FileTransmission的线程上 |
判断是否在主线程 |
ExecutorService sendFilePool() |
TransmissionConfig.sendFileTaskThreadCount() * TransmissionConfig.sendFileTaskMaxCount() |
发送文件的线程池 |
ExecutorService commandPool() |
Executors.newCachedThreadPool() |
发送命令socket的线程池 |
入口类,实现了FileTransmission接口,初始化方法参数接收TransmissionConfig和TransmissionScheduler
public FileTransmission(TransmissionConfig config) throws IOException
public FileTransmission(TransmissionConfig config, TransmissionScheduler scheduler) throws IOException| 方法 | 说明 |
|---|---|
TransmissionClient createOrGetClient(String hostAddress, Integer commandPort) |
通过此方法创建一个TransmissionClient |
void addOnClienListeners(OnClienListener onClienListener) |
监听客户端全局的回调 |
作为一个发送端或者接收端的抽象,请通过TransmissionClient.createOrGetClient方法创建此对象。
| 方法 | 说明 |
|---|---|
void sendFile |
发送文件 |
void pauseSend |
暂停发送文件 |
void continueSend |
继续发送文件 |
TransmissionFileInfo getSendFileInfo |
获取发送文件的信息 |
TransmissionState getSendState |
获取发送文件的状态 |
void pauseReceive |
暂停接收文件 |
void continueReceive |
继续接收文件 |
TransmissionFileInfo getReceiveFileInfo |
获取接收文件的信息 |
TransmissionState getReceiveState |
获取接收文件的状态 |
TransmissionState getReceiveState |
获取接收文件的状态 |
void addOnSendClientListener(OnSendClientListener) |
添加作为发送端端的回调 |
void addOnReceiveClientListeners(OnReceiveClientListener) |
添加作为接收端的回调 |
发送/接收的文件信息
String fileName文件名称Long fileSize文件大小String fileHash文件hash值File file文件Vector<TransmissionFileSectionInfo> sectionInfos文件分块信息Long startIndex分块文件的起始地址Long endIndex分块文件的结束地址Long finishIndex分块的完成进度地址
发送/接收的文件状态
START传输中PAUSE暂停中
是否同意接收文件的控制器
| 方法 | 说明 |
|---|---|
void accept() |
同意接收 |
void reject() |
拒绝接收 |
客户端全局的事件回调,就监听是否有文件传输过来了
public abstract void onReceiveFileInfo(TransmissionClient client, TransmissionFileInfo fileInfo, AcceptController controller)
TransmissionClient client客户端对象(判断是哪个客户端传过来的)TransmissionFileInfo fileInfo传过来的文件信息AcceptController controller是否同意的控制器
作为发送端的回调
void onAccept(Boolean accept) 对方是否同意接收的回调
Boolean accepttrue为同意,反之拒绝
void onProgress(double progress) 发送文件的进度回调
double progress0.0-1.0(1.0即发送完毕)
void onStateChange(TransmissionState state) 发送文件的状态改变回调
TransmissionState state
作为接收端的回调
void onProgress(double progress) 接收文件的进度回调
double progress0.0-1.0(1.0即接收完毕)
void onStateChange(TransmissionState state) 接收文件的状态改变回调
TransmissionState state
继承TransmissionConfig针对Android的一些适配
public class AndroidConfig extends TransmissionConfig {
Context context;
public AndroidConfig(Context context) {
this.context = context;
}
/**
* 获取cache路径
* @return
*/
@Override
public String saveFilePath() {
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
return context.getExternalCacheDir().getPath() + File.separator;
} else {
return context.getCacheDir().getPath() + File.separator;
}
}
}继承TransmissionScheduler针对Android的一些适配
public class AndroidScheduler extends TransmissionScheduler {
private static Handler handler = new Handler(Looper.getMainLooper());
@Override
public void run(Runnable scheduler) {
handler.post(scheduler);
}
}继承FileTransmission针对Android的一些适配
public class AndroidTransmission extends FileTransmission {
public AndroidTransmission(Context context) throws IOException {
super(new AndroidConfig(context), new AndroidScheduler());
}
@Override
public Boolean isMainThread() {
return Looper.getMainLooper().getThread().getId() == Thread.currentThread().getId();
}
}