写了很久的Android、pc文件无线双向传输开发,要开发Android的app和电脑的软件,用tco协议在局域网内互相传输文件。

中间遇到不少问题,把遇到的问题和解决的方法的罗列一下。



一.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掉

接收文件的DataInputStreamin = new DataInputStream(socket.getInputStream());也不能close掉


3.因为接收文件要一直监听,发送只需要在发送的时候发送,所以socket调用时也有所不同

发送类:

public void start(final String filePath) {//send(filePath);new Thread() {@Overridepublic void run() {sendFlag = true;while (sendFlag) {send(filePath);sendFlag =false;}}}.start();}

private void send(String filePath) { //work here!!!!!!!!!!!!!broken pipetry {Log.v("send", "send start");OutputStream out = socket.getOutputStream();File file = new File(filePath);String fileName = file.getName();Log.v("send fileName", fileName);......


接受类:

{@Overridepublic 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 blocke.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位。


暂时先写到这里

更多相关文章

  1. Android(4.2) Sensors 学习——G-sensor,Gyroscope驱动移植
  2. Android(安卓)Develop Training——Android保存应用配置(Saving
  3. 几点Android(安卓)开发中的小技巧
  4. 从CM刷机过程和原理分析Android系统结构
  5. Linux文件的特殊权限位SUID、SGID作用及编程设置/读取
  6. Android(安卓)IPC机制(三)在Android(安卓)Studio中使用AIDL实现跨
  7. Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy
  8. Android(安卓)Studio 使用jni
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android 简单联系人操作
  2. android中Bitmap对象怎么保存为文件?
  3. android studio混淆打包
  4. 技术|Android安装包优化
  5. android字符串处理(Mms模块短信内容解析)
  6. Android开发实践 带你理解使用WebView
  7. Android——继承SimpleAdapter重写自己的
  8. android -> 修改自动转为大写 的textAllC
  9. android XML文件序列化
  10. android 中RecyclerView 嵌套了 GridView