Android WebSocket即时通信

作者: 奔跑吧李博 | 来源:发表于2020-05-29 11:46 被阅读0次
HTTP与WebSocket响应方式区别

WebSocket存在的理由

我们已经有了 HTTP 协议,为什么还需要另一个协议?因为只靠Http通信有一个缺陷:通信只能由客户端发起,HTTP 协议做不到服务器主动向客户端推送信息。这种单向请求的特点,注定了如果服务器有连续的状态变化,服务端想主动通知客户端,就难以实现。因此,工程师们一直在思考,有没有更好的方法,而 WebSocket 就是这样诞生的。

WebSocket其特点包括:

  • 建立在 TCP 协议之上,服务器端的实现比较容易
  • 与 HTTP 协议有着良好的兼容性,默认端口也是 80 和 443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器
  • 数据格式比较轻量,性能开销小,通信高效
  • 可以发送文本、二进制数据
  • 协议标识符是 ws(如果加密,则为 wss),服务器网址就是 URL

使用Java-WebSocket库进行简单通信

在经过对比之后,我选择了Java-WebSocket这个开源框架,毕竟star数量也是蛮高的,有质量保证。Java-WebSocket库github地址。

1.引入库

implementation "org.java-websocket:Java-WebSocket:1.5.1"
代码示例

2.创建WebSocketClient类

public class WSClient extends WebSocketClient {

    public WSClient(URI serverUri) {
        super(serverUri);
    }

    public WSClient(URI serverUri, Draft protocolDraft) {
        super(serverUri, protocolDraft);
    }

    @Override
    public void onOpen(ServerHandshake handshakedata) {

    }

    @Override
    public void onMessage(String message) {

    }

    @Override
    public void onClose(int code, String reason, boolean remote) {

    }

    @Override
    public void onError(Exception ex) {

    }
}
回调方法含义:
onOpen():连接成功回调,获取握手数据

onMessage():接收消息回调,获取接收数据

onClose():关闭连接回调,获取关闭信息

onError():连接异常回调,获取异常信息

3.与ws协议或wss协议地址通信,创建Uri,这里用例子ws://echo.websocket.org

URI uri = URI.create("ws://echo.websocket.org");

4.创建WSClient示例,通过onMessage()方法接收信息。

    WSClient wsClient = new WSClient(uri) {
        @Override
        public void onMessage(String message) {
            Log.e("info", "收到消息 " + message);
        }
    };

5.发送信息,可以发送String类型和byte[]类型

wsClient.send("传给你信息");

温馨提示:

在封装WebSocket使用时,需要注意心跳检测和重连,间隔时间后需要校验,如果中断需要重连;在适当的退出位置调用close()关闭连接;与服务端通信需要协定好传递的json对象;注意需要校验登录的地方。

相关文章

网友评论

    本文标题:Android WebSocket即时通信

    本文链接:https://www.haomeiwen.com/subject/yeeaahtx.html