当前位置 主页 > 网站技术 > 代码类 >

    使用Android WebSocket实现即时通讯功能

    栏目:代码类 时间:2019-10-29 18:08

    最近做这个功能,分享一下。即时通讯(Instant Messaging)最重要的毫无疑问就是即时,不能有明显的延迟,要实现IM的功能其实并不难,目前有很多第三方,比如极光的JMessage,都比较容易实现。但是如果项目有特殊要求(如不能使用外网),那就得自己做了,所以我们需要使用WebSocket。

    WebSocket

    WebSocket协议就不细讲了,感兴趣的可以具体查阅资料,简而言之,它就是一个可以建立长连接的全双工(full-duplex)通信协议,允许服务器端主动发送信息给客户端。

    Java-WebSocket框架

    对于使用websocket协议,Android端已经有些成熟的框架了,在经过对比之后,我选择了Java-WebSocket这个开源框架,GitHub地址:https://github.com/TooTallNate/Java-WebSocket,目前已经有五千以上star,并且还在更新维护中,所以本文将介绍如何利用此开源库实现一个稳定的即时通讯功能。

    效果图

    国际惯例,先上效果图

    文章重点

    1、与websocket建立长连接

    2、与websocket进行即时通讯

    3、Service和Activity之间通讯和UI更新

    4、弹出消息通知(包括锁屏通知)

    5、心跳检测和重连(保证websocket连接稳定性)

    6、服务(Service)保活

    一、引入Java-WebSocket

    1、build.gradle中加入

    implementation "org.java-websocket:Java-WebSocket:1.4.0" 

    2、加入网络请求权限

    <uses-permission android:name="android.permission.INTERNET" />

    3、新建客户端类

    新建一个客户端类并继承WebSocketClient,需要实现它的四个抽象方法和构造函数,如下:

    public class JWebSocketClient extends WebSocketClient {
     public JWebSocketClient(URI serverUri) {
      super(serverUri, new Draft_6455());
     }
     @Override
     public void onOpen(ServerHandshake handshakedata) {
      Log.e("JWebSocketClient", "onOpen()");
     }
     @Override
     public void onMessage(String message) {
      Log.e("JWebSocketClient", "onMessage()");
     }
     @Override
     public void onClose(int code, String reason, boolean remote) {
      Log.e("JWebSocketClient", "onClose()");
     }
     @Override
     public void onError(Exception ex) {
      Log.e("JWebSocketClient", "onError()");
     }
    }

    其中onOpen()方法在websocket连接开启时调用,onMessage()方法在接收到消息时调用,onClose()方法在连接断开时调用,onError()方法在连接出错时调用。构造方法中的new Draft_6455()代表使用的协议版本,这里可以不写或者写成这样即可。

    4、建立websocket连接

    建立连接只需要初始化此客户端再调用连接方法,需要注意的是WebSocketClient对象是不能重复使用的,所以不能重复初始化,其他地方只能调用当前这个Client。

    URI uri = URI.create("ws://*******");
    JWebSocketClient client = new JWebSocketClient(uri) {
     @Override
     public void onMessage(String message) {
      //message就是接收到的消息
      Log.e("JWebSClientService", message);
     }
    };
    
    

    为了方便对接收到的消息进行处理,可以在这重写onMessage()方法。初始化客户端时需要传入websocket地址(测试地址:ws://echo.websocket.org),websocket协议地址大致是这样的