Android WebSocket即时通信
2020-05-29 本文已影响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对象;注意需要校验登录的地方。