多线程,断点续传,局域网文件传输
传输协议说明
可继承这个类做相关的自定义配置
方法 | 默认值 | 说明 |
---|---|---|
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 accept
true
为同意,反之拒绝
void onProgress(double progress)
发送文件的进度回调
double progress
0.0
-1.0
(1.0
即发送完毕)
void onStateChange(TransmissionState state)
发送文件的状态改变回调
TransmissionState state
作为接收端的回调
void onProgress(double progress)
接收文件的进度回调
double progress
0.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();
}
}