美文网首页
Socket来实现大文件的断点续传

Socket来实现大文件的断点续传

作者: JuSong | 来源:发表于2017-03-03 11:40 被阅读0次

实现流程图:

 

 

 

代码示例:

客户端(Android端)实现示例:

1.因为断点续传,我们需要保存上传的进度,我们需要用到数据库,这里我们定义一个数据库 管理类:

public class DBOpenHelper extends SQLiteOpenHelper {

public DBOpenHelper(Context context) {
super(context, "jay.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS uploadlog (_id integer primary key autoincrement, path varchar(20), sourceid varchar(20))");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

 

2.然后是数据库操作类:UploadHelper.java

public class UploadHelper {
private DBOpenHelper dbOpenHelper;

public UploadHelper(Context context) {
dbOpenHelper = new DBOpenHelper(context);
}

public String getBindId(File file) {
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select sourceid from uploadlog where path=?", new String[]{file.getAbsolutePath()});
if (cursor.moveToFirst()) {
return cursor.getString(0);
}
return null;
}

public void save(String sourceid, File file) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.execSQL("insert into uploadlog(path,sourceid) values(?,?)",
new Object[]{file.getAbsolutePath(), sourceid});
}

public void delete(File file) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.execSQL("delete from uploadlog where path=?", new Object[]{file.getAbsolutePath()});
}
}

 

3.最后就是我们的MainActivity.java了:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private EditText edit_fname;
private Button btn_upload;
private Button btn_stop;
private ProgressBar pgbar;
private TextView txt_result;

private UploadHelper upHelper;
private boolean flag = true;


private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
pgbar.setProgress(msg.getData().getInt("length"));
float num = (float) pgbar.getProgress() / (float) pgbar.getMax();
int result = (int) (num * 100);
txt_result.setText(result + "%");
if (pgbar.getProgress() == pgbar.getMax()) {
Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_SHORT).show();
}
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindViews();
upHelper = new UploadHelper(this);
}

private void bindViews() {
edit_fname = (EditText) findViewById(R.id.edit_fname);
btn_upload = (Button) findViewById(R.id.btn_upload);
btn_stop = (Button) findViewById(R.id.btn_stop);
pgbar = (ProgressBar) findViewById(R.id.pgbar);
txt_result = (TextView) findViewById(R.id.txt_result);

btn_upload.setOnClickListener(this);
btn_stop.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_upload:
String filename = edit_fname.getText().toString();
flag = true;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File file = new File(Environment.getExternalStorageDirectory(), filename);
if (file.exists()) {
pgbar.setMax((int) file.length());
uploadFile(file);
} else {
Toast.makeText(MainActivity.this, "文件并不存在~", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(MainActivity.this, "SD卡不存在或者不可用", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_stop:
flag = false;
break;
}
}

private void uploadFile(final File file) {
new Thread(new Runnable() {
public void run() {
try {
String sourceid = upHelper.getBindId(file);
Socket socket = new Socket("172.16.2.54", 12345);
OutputStream outStream = socket.getOutputStream();
String head = "Content-Length=" + file.length() + ";filename=" + file.getName()
+ ";sourceid=" + (sourceid != null ? sourceid : "") + "\r\n";
outStream.write(head.getBytes());

PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());
String response = StreamTool.readLine(inStream);
String[] items = response.split(";");
String responseSourceid = items[0].substring(items[0].indexOf("=") + 1);
String position = items[1].substring(items[1].indexOf("=") + 1);
if (sourceid == null) {//如果是第一次上传文件,在数据库中不存在该文件所绑定的资源id
upHelper.save(responseSourceid, file);
}
RandomAccessFile fileOutStream = new RandomAccessFile(file, "r");
fileOutStream.seek(Integer.valueOf(position));
byte[] buffer = new byte[1024];
int len = -1;
int length = Integer.valueOf(position);
while (flag && (len = fileOutStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
length += len;//累加已经上传的数据长度
Message msg = new Message();
msg.getData().putInt("length", length);
handler.sendMessage(msg);
}
if (length == file.length()) upHelper.delete(file);
fileOutStream.close();
outStream.close();
inStream.close();
socket.close();
} catch (Exception e) {
Toast.makeText(MainActivity.this, "上传异常~", Toast.LENGTH_SHORT).show();
}
}
}).start();
}

}

相关文章

  • Socket来实现大文件的断点续传

    实现流程图: 代码示例: 客户端(Android端)实现示例: 1.因为断点续传,我们需要保存上传的进度,我们需要...

  • IOS 断点续传原理浅析(第一篇)

    断点续传概述: 断点续传就是从文件上次中断的地方开始重新下载或上传数据,当下载大文件的时候,如果没有实现断点续传功...

  • iOS-16 断点续传 下载

    断点续传概述: 断点续传就是从文件上次中断的地方开始重新下载或上传数据,当下载大文件的时候,如果没有实现断点续传功...

  • 知识点

    网络编程 我项目中Socket是怎么实现IM通讯的;Socket通讯,怎么实现图片,大文件传输;http报文结构;...

  • iOS之实现大文件下载存储的操作方式

    前言 最近在整理梳理断点续传的功能,查看了许多关于大文件存储实现的方式。梳理一下它们的特点。 实现文件存储的三种方...

  • 大文件断点续传

    对于大文件,往往需要通过断点续传来应对不稳定的网络环境。这几天正好做毕设,记下来断点续传的一些想法 H5断点续传 ...

  • webuploader实现大文件断点续传

    前端代码(基于Yii框架,逻辑可供参考) 后端接口代码

  • 日常出现疑难问题

    BCompare4注册码 webuploader 大文件分片,断点续传,以及秒传功能 VMware Worksta...

  • 有关文件上传(未完待续)

    分片:将一个完整的大文件按照一定的规则切分成多个小的片段,方便后续的并发处理和断点续传。断点续传:当因为环境因素,...

  • php + webuploader 实现大文件 断点续传

    用过php的童鞋们都知道,服务器对于文件的上传是有限制的,php的默认设置只能上传2M大小的文件,那么在限制范围内...

网友评论

      本文标题:Socket来实现大文件的断点续传

      本文链接:https://www.haomeiwen.com/subject/sailgttx.html