我们要实现一个简单的客户端推送功能,要想在Android中建立TCP长连接,就不能使用HttpUrlConnection或者HttpClient等网络请求API,因为它们是属于上层的、HTTP协议的。推送功能需要使用更底层的API,才能实现对TCP协议那一层的操作,Java为开发者提供了网络套接字Socket,它封装了很多TCP的操作。对于移动端来说,一个推送的基本框架需要包含。

  • 和服务器端建立连接的功能(长连接)
  • 发送数据给服务端的功能 (发送数据)
  • 从服务器端接收推送数据的能力 (接收数据)
  • 心跳包的实现 (心跳包)
    代码实现中,上面每个功能会分别封装成独立的线程,然后通过管理器统筹连接的建立和管理,下面介绍的核心代码都是在线程中实现的。

一、建立长连接

 长连接的建立主要是调用Socket类的connect方法实现的,核心代码如下。其中TCP_URL表示服务器端的URL地址,TCP_PORT表示端口号,SOCKET_CONNECT_TIMEOUT表示此次连接的超时时间,这些需要根据具体的需求进行设置。setKeepAlive表示这次连接是长连接。

mSocket = new Socket();
mSocket.connect(new InetSocketAddress(TCP_URL, TCP_PORT), SOCKET_CONNECT_TIMEOUT);
mSocket.setKeepAlive(true);

 通过以上代码,一个TCP长连接就建立了,当然,生产代码要比上面的复杂得多,比如,需要判断连接是否已经建立,已经存在的话需要关闭重新建立;当手机的网络不可用时,需要增加延时重试机制,在建立Socket连接的过程中出现异常,需要重新建立连接等。


二、发送数据

 长连接建立以后,我们需要保存返回的Socket实例,这个实例代表这个长连接的通道,后续移动端和服务器端的数据通信都是通过这个实例进行的,既然有通信,那么需要定义好前后端通信的数据格式,Socket通信发送的是字节数据,通常情况下,一个完整的消息至少包含:协议头+协议主体内容+校验码,数据发送的核心代码如下(为简单起见,发送时协议格式是:协议主体内容长度(两个字节)+主体内容)。

Socket socket = PushSocket.getInstance();//获取Socket实例

String content = ....;//发送的数据内容

DataOutputStream out = new DataOutputStream(socket.getOutputStream());
short len = (short)content.length;
out.writeByte(b1);//java short是大端,Linux c short 是小端
out.writeByte(b2);
out.write(mContent);
out.flush();

三、接收数据


四、实现心跳包

更多相关文章

  1. java 对称加密——密钥与加密后的数据存盘方式
  2. Java8 新特性之流式数据处理
  3. 充分利用 Java 的元数据,第 3 部分:高级处理
  4. Android 多线程下载文件原理霸气解析介绍 (完结版)-----greendao
  5. java 的 数据库连接测试类 (SQL server)
  6. 如何将mysql中的数据插入组合框中?
  7. jsoup 分页抓取网页数据Java HTML Parser
  8. Java中的数据类型
  9. 在文件中添加新数据后,JComboBox不会刷新

随机推荐

  1. 如何改变这个js的持续时间
  2. jquery.validate.js使用之自定义表单验证
  3. 在each()函数内部调用多个ajax ..然后在完
  4. 在Ajax请求后添加了自闭标记
  5. Jquery:JS弹出窗口DIV层效果
  6. 如何使用ajax GET或POST方法将数据传递到
  7. 如何从SQL SELECT查询中的c#变量创建jQuer
  8. 在Chrome中使用AJAX发送选项而不是GET/PO
  9. jQuery实现点击全选和取消全选
  10. 适用于prettyPhoto的FLV播放器(基于jQuery