Android、pc文件无线双向传输软件
2013-06-09 12:02
405 查看
写了很久的Android、pc文件无线双向传输开发,要开发Android的app和电脑的软件,用tco协议在局域网内互相传输文件。
中间遇到不少问题,把遇到的问题和解决的方法的罗列一下。
一.socket的问题。
在android的app上,我把连接socket,发送文件和接收文件分成三个类,而且本身对tcp双向传输不熟,所以这部分就遇到很多问题。
1.socket在类之间传递
首先在socket连接类上连接socket并写个方法传递socket,
接着在main.java上调用并传递socket给另两个类,
另外两个类上用同一个方法介绍socket
2.
socket如果要一直连着就不能close掉。
发送文件类的OutputStream out = socket.getOutputStream();,的out不能close掉
接收文件的DataInputStream in = new DataInputStream(socket.getInputStream());也不能close掉
3.因为接收文件要一直监听,发送只需要在发送的时候发送,所以socket调用时也有所不同
发送类:
接受类:
其实只要用数据输入输出流取得socket的数据,socket就可以基本不用管了,一直监听一直发送都无所谓
二、数据类型问题
因为首先我要发送文件名和文件大小,需要固定字节发送,java和c++数据类型不完全一样,而且每个数据类型大小也很可能不同,所以在数据方面也花了很多时间
1.首先是电脑发文件给手机,我在C++上用的是Qt的64位的qint64,所以java上也要用相同位数的数据类型BigInteger
2.手机发给电脑,在Android的获取文件大小的方法返回的是long,上网查了下long是8bytes,1byte8位,所以应该是64位
但是实际应用中就出现问题。
上面是正确代码,用的是4bytes,而不是8bytes。
long转bytes用的是百度的方法,而不能用b = totalSize.toString().getBytes();
所以在C++上也不能用quint64,而要用quint32,也就是32位。
暂时先写到这里
中间遇到不少问题,把遇到的问题和解决的方法的罗列一下。
一.socket的问题。
在android的app上,我把连接socket,发送文件和接收文件分成三个类,而且本身对tcp双向传输不熟,所以这部分就遇到很多问题。
1.socket在类之间传递
首先在socket连接类上连接socket并写个方法传递socket,
接着在main.java上调用并传递socket给另两个类,
另外两个类上用同一个方法介绍socket
public void setSocket(Socket temp) { socket = new Socket(); socket = temp; }
2.
socket如果要一直连着就不能close掉。
发送文件类的OutputStream out = socket.getOutputStream();,的out不能close掉
接收文件的DataInputStream in = new DataInputStream(socket.getInputStream());也不能close掉
3.因为接收文件要一直监听,发送只需要在发送的时候发送,所以socket调用时也有所不同
发送类:
public void start(final String filePath) { //send(filePath); new Thread() { @Override public void run() { sendFlag = true; while (sendFlag) { send(filePath); sendFlag =false; } } }.start(); }
private void send(String filePath) { //work here!!!!!!!!!!!!!broken pipe try { Log.v("send", "send start"); OutputStream out = socket.getOutputStream(); File file = new File(filePath); String fileName = file.getName(); Log.v("send fileName", fileName); ......
接受类:
{ @Override public void run() { while(true) { try { in = new DataInputStream(socket.getInputStream()); while (in.available() >0) { download(); if(in.available() == 0) { Log.v("step", "succeed!!"); return; } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 获取socket上的信息 } } }.start();
private void download() { byte[] bytes = new byte[8]; // 服务器上已定义了发送一段8字节的信息,所以定义8字节 in.read(bytes);// 获取文件总大小(包括fileNameSize,fileSize) totalSize = new BigInteger(bytes); Log.v("receive", totalSize.toString());因为我一开始对tcp的socket不熟,以为要像udp、串口这样,同一时间是自能选择发送或接收,所以要把socket控制好。
其实只要用数据输入输出流取得socket的数据,socket就可以基本不用管了,一直监听一直发送都无所谓
二、数据类型问题
因为首先我要发送文件名和文件大小,需要固定字节发送,java和c++数据类型不完全一样,而且每个数据类型大小也很可能不同,所以在数据方面也花了很多时间
1.首先是电脑发文件给手机,我在C++上用的是Qt的64位的qint64,所以java上也要用相同位数的数据类型BigInteger
byte[] bytes = new byte[8]; // 服务器上已定义了发送一段8字节的信息,所以定义8字节 in.read(bytes);// 获取文件总大小(包括fileNameSize,fileSize) totalSize = new BigInteger(bytes); Log.v("receive", totalSize.toString());
2.手机发给电脑,在Android的获取文件大小的方法返回的是long,上网查了下long是8bytes,1byte8位,所以应该是64位
但是实际应用中就出现问题。
byte[] b = new byte[4]; Long totalSize = file.length() +Long.valueOf(fileName.length()+1); b = longToBytes(totalSize); out.write(b);
上面是正确代码,用的是4bytes,而不是8bytes。
long转bytes用的是百度的方法,而不能用b = totalSize.toString().getBytes();
所以在C++上也不能用quint64,而要用quint32,也就是32位。
暂时先写到这里
相关文章推荐
- Android、pc文件无线双向传输软件
- 【手机变身无线音箱-WIFI流媒体传输】--音乐在PC和手机间双向播放-详解Android DLNA使用-使用DLNA实现不同设备间媒体共享
- 非堵塞socket实现android手机与PC的文件传输
- 非阻塞socket实现android手机与PC的文件传输
- Android 用Socket实现PC和手机的文件传输
- mac上连接Android手机并传输文件
- Android软件开发之制作第三方数据库与读取文件中数据库详解(三十四)
- <转载>Android中调用系统所装的软件打开文件
- android -- 蓝牙 bluetooth (四)OPP文件传输
- 黑客出售黎巴嫩间谍软件DarkCaracal,窃取全球Android手机、WindowsPC数据
- python for android: pad 从PC接收文件
- android蓝牙传输文件时的文件格式限制及其解决方法
- 基于TCP的Socket文件双向传输
- Android软件测试的日志文件(Log文件)之多少
- PC与开发板之间最简单快速的文件传输方式
- PC与开发板之间最简单快速的文件传输方式
- android加密文件在pc上破解的若干方法
- Android 软件测试日志文件抓取
- Android手机软件汉化教程---第三课 xml文件汉化
- 在Android设备与Mac电脑之间传输文件