将臣的博客

移动互联网

如何在同一Wifi网段上传输文件

 最近做了一个Android平台Wifi功能的实现方法,发一下个人的经验来跟大家分享一下。。
    时间不多了,言归正传。我将如何实现这个功能分为三个步骤:
    1、首先,由类WifiInfo的getIpAddress方法获得自己在该AP上所分配到的IP地址,这个得到的是long int型的,所以记得先将其转换为String型哦(方法很简单,代码如下)
    private String intToIp(int i) {
     return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "."
     + ((i >> 24) & 0xFF);
    }

    2、编写客户端:
    客户端与服务器通信之前,首先用socket创建连接,再由要传递的文件得到一个Stream对象(这些就不多说了,这种简单的socket通信大家都懂的)。值得一提的是传输的方法,一开始我使用序列化,创建一个类用来封装要传输的文件,然后传递该类的对象,服务器端也要对应的写一个类,用来处理所收到的这个对象,然后再获得该文件的内容。
    呵呵,我相信各位一看到这个2B的做法很想笑,原因很简单:这个方法是无法实现Android跟Iphone之间文件传输的。所以,我跟同事(Iphone开发工程师)一起写了一个简单的传送协议,放上来给大家提提建议:

    【1个字节的文件类型】+【4个字节的文件长度】+【N个字节的文件内容】+【1个字节的文件结束符】

    其中,文件类型是大家一开始协商好要传送的文件的一个代号;文件长度是将int的length转换为4个字节的byte,所以它可以实现2^32的文件长度(这样做的好处大家都应该懂的);文件结束符也是大家先妥协的。

    发送文件内容的时候,应该先定义一个1024字节的缓冲区,也就是每次发送1K的数据给对方手机,每次发送完就清空缓冲区,再装数据之后传送。最后记得关闭socket以及stream对象。

    3、编写服务器:
    服务器端有点难度哦亲,因为从用户的角度出发,他绝对不希望软件界面只是默默的等待连接以及数据的推送。因为serversocket接收数据时,accept操作是阻塞进行的,所以此时除了创建一个接收线程以外,还应该另外另外创建一个判断接受是否超时的线程(方法很简单,只需要将其本身sleep一定的时间即可)。另外,还应该配合UI的进度条来显示是否接受,以及接受进度。

   读取数据时应该按照发送方的协议来接收。必要时还应该使用Handler来处理Thread发送过来的Message。最后,记得关闭socket以及stream对象。


源代码下载:http://download.csdn.net/detail/chenxijie888/4198998。


阅读更多
个人分类: Android
想对作者说点什么? 我来说一句

同一Wifi网段匹配、传输文件

2012年04月04日 11KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭