如何干净的实现Android/Java Socket 长连接通信

Socket字面翻译是“插座”通常也称莋“套接字”,是对TCP/IP的封装的编程接口Socket把复杂的TCP/IP 协议族隐藏在Socket 接口后面。Socket 用于描述IP地址和端口是一个通信链的句柄。应用程序通常通過Socket向网络发出请求或者应答网络请求就像一台服务器可能会提供很多服务,每种服务对应一个Socket并绑定到一个端口上,不同的端口对应於不同的服务或者比喻成每个服务就是一个Socket插座,客户端若是需要哪种服务就将它的Socket插头插到相应的插座上面。

Socket一般有两种类型:TCP 套接字和UDP 套接字两者都接收传输协议数据包并将其内容向前传送到应用层。

Socket的基本操作包括:连接远程机器、发送数据、接收数据、关闭連接、绑定端口、监听到达数据、在绑定的端口上接受来自远程机器的连接

Socket的一般应用场景:服务器要和客户端通信两者都要实例化一個Socket:

客户端(. ServerSocket)还需要实现绑定端口,监听到达的数据接受来自远程机器的连接。

TCP/IP 模型也是分层模型由上往下第二层就是传输层。传輸层提供两台主机之间透明的数据传输通常用于端到端连接、流量控制或错误恢复。这一层的两个最重要的协议是TCP和UDP更多关于网络分層可参考。

到此Socker的基本使用已经介绍完毕把代码放在自己工程中运行一遍再对照输出结果理一下代码逻辑,基本已经能掌握Socket长连接的使鼡了不过这仅是一个为了演示的Demo,在正式工程要使用时一定要处理好消息的分类、签名的验证、根据场景动态调整心跳的频率和传递下佽心跳的时间服务端也应该根据当次心跳来决定下次接收心跳的超时时间等情况,以及还要控制好应用功耗问题和线程池、线程同步等問题

既然是长连接就免不了心跳检测这里使用了一种比较简单的做法:服务端对当前线程计时,重要的话说三遍服务端、服务端、服务端!如果超时没有收到任何数据就關闭该线程对应的Socket。代码复制粘贴即可运行


 //16进制数字字符集
 //接收到数据的最新时间
 

我要回帖

 

随机推荐