上一篇文章聊了下数据存储和常用的传输协议,不过对于自定义传输协议这里留了个坑,正好有点时间,就抓紧填上:)
既然选择原生socket,那么有个基本的选择就是tcp/udp的问题.
这个其实还是看业务自己的选择,只是如果选择了udp的话,那么很多问题都可以不用考虑,比如粘包问题。但是udp有个限制是每次传输的数据大小不能超过64K,这个要注意。
为了考虑复杂的情况,我们还是主要说tcp的实现,这篇文章先说下socket使用相关的一些库和代码吧
Android端开发
对于android端,我们有两个主要选择:阻塞socket和非阻塞socket。
阻塞socket就是正常的socket,当调用recv的时候,会阻塞住直到返回数据。
非阻塞socket在android上可以直接使用nio,因为自己之前一直是做c++和python,所以其实一开始nio的时候真心有些不太使用,把几个要注意的点列一下:
1. 当网络断线的时候,有些手机如S4,会出现这个问题,channel.finishConnect()会一直等超时 60秒。之后会抛出一个 TimeoutException.
解决方法是:
channel.socket().setSoTimeout(5)
来设置成只等5秒。
比较诡异的是,明明是异步io了,为什么还是会有等待超时的情况。还要在研究下。
2. 当网络不在线的时候,启动connect,依然可以进入isConnectable的判断中,并且可以调用finishconnect。
解决方案:finishConnect之后 ...