Android、pc文件无线双向传输软件

come from: http://download.csdn.net/detail/raul239/8049907 

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

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



一.socket的问题。

在android的app上,我把连接socket,发送文件和接收文件分成三个类,而且本身对tcp双向传输不熟,所以这部分就遇到很多问题。

1.socket在类之间传递

首先在socket连接类上连接socket并写个方法传递socket,

接着在main.Java上调用并传递socket给另两个类,

另外两个类上用同一个方法介绍socket

[java]  view plain  copy
  1. public void setSocket(Socket temp) {  
  2.     socket = new Socket();  
  3.     socket = temp;  
  4.   
  5. }  

2.

socket如果要一直连着就不能close掉。

发送文件类的OutputStream out = socket.getOutputStream();,的out不能close掉

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


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

发送类:

[java]  view plain  copy
  1. public void start(final String filePath) {  
  2.         //send(filePath);  
  3.           
  4.         new Thread() {  
  5.             @Override  
  6.             public void run() {  
  7.                 sendFlag = true;  
  8.                 while (sendFlag) {  
  9.                     send(filePath);  
  10.                     sendFlag =false;  
  11.   
  12.                 }  
  13.             }  
  14.         }.start();  
  15.     }  

[java]  view plain  copy
  1. private void send(String filePath) { //work here!!!!!!!!!!!!!broken pipe  
  2.   
  3.     try {  
  4.         Log.v("send""send start");  
  5.           
  6.         OutputStream out = socket.getOutputStream();  
  7.         File file = new File(filePath);  
  8.           
  9.         String fileName = file.getName();  
  10.         Log.v("send fileName", fileName);  
  11.         ......  


接受类:

[java]  view plain  copy
  1. {         
  2.         @Override  
  3.         public void run() {  
  4.             while(true)  
  5.             {                                                                                                           
  6.                 try {  
  7.                     in = new DataInputStream(socket.getInputStream());  
  8.                       
  9.                         while (in.available() >0) {  
  10.   
  11.                             download();  
  12.   
  13.                             if(in.available() == 0)  
  14.                             {  
  15.                                 Log.v("step""succeed!!");  
  16.                                 return;   
  17.                             }  
  18.                         }  
  19.             } catch (IOException e) {  
  20.                 // TODO Auto-generated catch block  
  21.                 e.printStackTrace();  
  22.             } // 获取socket上的信息  
  23.         }  
  24.     }  
  25.     }.start();  


[java]  view plain  copy
  1. private void download() {  
  2.   
  3.             byte[] bytes = new byte[8]; // 服务器上已定义了发送一段8字节的信息,所以定义8字节  
  4.             in.read(bytes);// 获取文件总大小(包括fileNameSize,fileSize)  
  5.             totalSize = new BigInteger(bytes);  
  6.             Log.v("receive", totalSize.toString());  
因为我一开始对tcp的socket不熟,以为要像udp、串口这样,同一时间是自能选择发送或接收,所以要把socket控制好。

其实只要用数据输入输出流取得socket的数据,socket就可以基本不用管了,一直监听一直发送都无所谓


二、数据类型问题

因为首先我要发送文件名和文件大小,需要固定字节发送,java和c++数据类型不完全一样,而且每个数据类型大小也很可能不同,所以在数据方面也花了很多时间

1.首先是电脑发文件给手机,我在C++上用的是Qt的64位的qint64,所以java上也要用相同位数的数据类型BigInteger

[java]  view plain  copy
  1. byte[] bytes = new byte[8]; // 服务器上已定义了发送一段8字节的信息,所以定义8字节  
  2. in.read(bytes);// 获取文件总大小(包括fileNameSize,fileSize)  
  3. totalSize = new BigInteger(bytes);  
  4. Log.v("receive", totalSize.toString());  

2.手机发给电脑,在Android的获取文件大小的方法返回的是long,上网查了下long是8bytes,1byte8位,所以应该是64位

但是实际应用中就出现问题。

[java]  view plain  copy
  1. byte[] b = new byte[4];  
  2. Long totalSize = file.length() +Long.valueOf(fileName.length()+1);  
  3. b = longToBytes(totalSize);  
  4. out.write(b);  
上面是正确代码,用的是4bytes,而不是8bytes。

long转bytes用的是百度的方法,而不能用b = totalSize.toString().getBytes();


所以在C++上也不能用quint64,而要用quint32,也就是32位。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值