如何在同一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对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值