package com.example.qingyangdemo.thread; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.PushbackInputStream; import java.io.RandomAccessFile; import java.net.Socket; import android.os.Handler; import android.os.Message; import android.util.Log; import com.example.qingyangdemo.base.AppException; import com.example.qingyangdemo.base.BaseApplication; import com.example.qingyangdemo.bean.Upload; import com.example.qingyangdemo.common.DBManager; import com.example.qingyangdemo.common.StringUtil; import com.example.qingyangdemo.common.UpLoadManager; import com.example.qingyangdemo.net.URL; /** * 上传的线程 * * @author 赵庆洋 * */ public class UploadThread extends Thread { private Socket socket; private File file; public final static int BUFFER = 1024; private DBManager dbManager; private BaseApplication application; private boolean start = true; private Handler handler; private String savePath; public UploadThread(BaseApplication application, DBManager dbManager, Handler handler, File file, String savePath) { this.application = application; this.dbManager = dbManager; this.file = file; this.handler = handler; this.savePath = savePath; } /* * 服务器提出上传请求 */ private String request(String sourceid) throws IOException { DataInputStream in = new DataInputStream(socket.getInputStream()); DataOutputStream out = new DataOutputStream(socket.getOutputStream()); String params = "length=" + file.length() + ";filename=" + file.getName() + ";sourceid=" + sourceid + ";filePath=" + savePath; ; // 发出上传请求 out.writeUTF(params); out.flush(); // 返回文件字符 return in.readUTF(); } @Override public void run() { try { String sourceid = dbManager.getBindId(file.getAbsolutePath()); socket = new Socket(application.getIpAdress(), URL.PC_UP_PORT); String response = request(sourceid); String[] items = response.split(";"); // 服务端断点记录标示符 String responseid = items[0].substring(items[0].indexOf("=") + 1); // 服务端断点位置 String position = items[1].substring(items[1].indexOf("=") + 1); // 没上传过此文件,添加到数据库 if (StringUtil.isEmpty(sourceid)) { Upload upload = new Upload(); upload.setSourceid(responseid); upload.setUploadfilepath(file.getAbsolutePath()); dbManager.saveUpload(upload); } RandomAccessFile fileOutStream = new RandomAccessFile(file, "r"); DataOutputStream out = new DataOutputStream( socket.getOutputStream()); // 移动到断点处继续读取 fileOutStream.seek(Long.valueOf(position)); byte[] buffer = new byte[BUFFER]; int len = -1; long length = Long.valueOf(position); while (start && (len = fileOutStream.read(buffer)) != -1) { out.write(buffer, 0, len); out.flush(); length += len; Message msg = new Message(); msg.what = UpLoadManager.UPLOAD_UPDATE; msg.obj = length; handler.sendMessage(msg); } fileOutStream.close(); out.close(); if (file.length() == length) { dbManager.delUpload(file.getAbsolutePath()); Log.v(AppException.LOG_TAG, "上传完毕"); handler.sendEmptyMessage(UpLoadManager.UPLOAD_SUCCESS); } } catch (Exception e) { e.printStackTrace(); Log.v(AppException.LOG_TAG, "上传出错"); handler.sendEmptyMessage(UpLoadManager.UPLOAD_FAILL); } finally { if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } public boolean isStart() { return start; } public void setStart(boolean start) { this.start = start; } }