c++服务器与android客户端进行文件传输功能的实现

[由一个线程类,专门用于接收文件]private class ThreadRecvAndWriteFile extends Thread {String filename;int FileLen;FileOutputStream file;// private byte []byteArrayData=new byte[CHUNK_SIZE];public ThreadRecvAndWriteFile(String filename, int FileLen) {this.filename = "/sdcard/" + filename;this.FileLen = FileLen;}public void errorPro() {byte errorDate[] = new byte[NetWorkErrorByte];int errorLeft = NetWorkErrorByte;int e_ret = 0;int e_idx = 0;while (errorLeft > 0) {// int ret=recv(server,&date[idx],nLeft,0);try {e_ret = app.mGlobalSocket.getInputStream().read(errorDate,e_idx, errorLeft);} catch (Exception e) {}e_idx += e_ret;errorLeft -= e_ret;}for (int i = 0; i < errorDate.length; i++) {if (errorDate[i] != 0) {try {file.write(errorDate, i, NetWorkErrorByte – i);file.flush();FileLen -= (NetWorkErrorByte – i);break;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}public void run() {isFileDownload = false;isDownloading=true;if (!app.isLink) {return;}try {NetDataTypeTransform mTransform = new NetDataTypeTransform();File mFile = new File(filename);file = new FileOutputStream(mFile);errorPro();int nChunkCount = FileLen / CHUNK_SIZE_FOR_ANDROID;if (FileLen % CHUNK_SIZE_FOR_ANDROID != 0) {nChunkCount++;}mHandler.sendEmptyMessage(-1);for (int i = 0; i < nChunkCount; i++) {mHandler.sendEmptyMessage(i);byte date[] = new byte[CHUNK_SIZE_FOR_ANDROID];int nLeft;if (i + 1 == nChunkCount)// 最后一块nLeft = FileLen – CHUNK_SIZE_FOR_ANDROID* (nChunkCount – 1);elsenLeft = CHUNK_SIZE_FOR_ANDROID;int idx = 0;int ret = 0;while (nLeft > 0) {// int ret=recv(server,&date[idx],nLeft,0);ret = 0;try {ret = app.mGlobalSocket.getInputStream().read(date,idx, nLeft);} catch (Exception e) {mHandler.sendEmptyMessage(-7);}idx += ret;nLeft -= ret;}file.write(date, 0, idx);file.flush();Log.d("WriteFiles", "have recv count" + i);}file.close();File checkFile = new File(filename);if (checkFile.length() < FileLen) {isFileDownload = false;mHandler.sendEmptyMessage(0);return;} else {isFileDownload = true;}isDownloading=false;mHandler.sendEmptyMessage(MaxProgress);// Toast.makeText(app.getApplicationContext(),"文件以保存到"+filename,Toast.LENGTH_SHORT).show();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}解释:为什么会有public void errorPro()函数。之前的编程过程中,并没有这个函数。而且,在模拟器上测试的时候,没有出现任何的问题。然而,当android程序安装在手机上之后,我就发现:每次下载的文件都不能使用,打不开!但是文件的大小却和源文件相同。当时,我的推断是:肯定是在无线传输过程中出现了差错!要知道,对于一个可执行程序而言,即便有1bit出错,程序也不能正常运行。然而,事情并不是这样的!!既然服务器和客户端建立的是基于TCP/IP协议的连接,那么它们之间的传输应该是可靠的!于是,我便用二进制文件比较器,对下载的文件和源文件进行对比,发现了一个奇怪的现象:下载的文件的前684个字节竟然全为0,而后面的字节才和源文件一致,并且文件缺少源文件的684个字节。于是,我就编写了一个errorPro()函数,将前面的全0字节给忽略掉,而不影响文件的传输。最终,,代码在模拟器上和手机上都运行的很好!而且下载很大的文件时,也没有出错!我现在还不知道为什么会有684字节的全0出现在文件头部,而在模拟器上测试时却没有。以后想清楚之后,在此补充完整。

人若勇敢就是自己最好的朋友

c++服务器与android客户端进行文件传输功能的实现

相关文章:

你感兴趣的文章:

标签云: