前言
使用Java-WebSocket库实现了直播中的弹幕功能,与即时通讯功能类似,这里记录一下。
准备工作
在build.gradle中加入依赖
implementation "org.java-websocket:Java-WebSocket:1.4.0"
开启网络权限
<uses-permission android:name="android.permission.INTERNET" />
编写代码
自定义一个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()"); }}
在需要使用WebSocket的地方,创建WebSocketClient实例并建立连接
URI uri = URI.create("ws://*******");JWebSocketClient client = new JWebSocketClient(uri) { @Override public void onMessage(String message) { //对接收到的消息message进行处理 ... }};
try { client.connectBlocking();} catch (InterruptedException e) { e.printStackTrace();}
创建实例时重写onMessage方法,实现对消息的处理逻辑,有需要还可以重写onOpen、onClose、onError方法。之后,在需要发送消息的地方,比如点击按钮后,发送消息
if (client != null && client.isOpen()) { client.send("...");}
在需要关闭连接的地方关闭
private void closeConnect() { try { if (null != client) { client.close(); } } catch (Exception e) { e.printStackTrace(); } finally { client = null; //避免重复实例化WebSocketClient对象 }}
注意
有很多情况会导致WebSocket断开连接,甚至,我在使用的过程中,发现每隔一段时间,如果WebSocket没有接收到消息,它就会自动断开,重写onClose方法(onClose(int code, String reason, boolean remote))打出日志,其中code为1006,超时自动关闭。因此,我们需要心跳检测与重连:
private static final long HEART_BEAT_RATE = 10 * 1000;//每隔10秒进行一次对长连接的心跳检测 private Handler mHandler = new Handler(); private Runnable heartBeatRunnable = new Runnable() { @Override public void run() { if (client != null) { if (client.isClosed()) { reconnectWs(); } } else { //如果client已为空,重新初始化websocket createSocketClient(); } //定时对长连接进行心跳检测 mHandler.postDelayed(this, HEART_BEAT_RATE); } }; /** * 开启重连 */ private void reconnectWs() { mHandler.removeCallbacks(heartBeatRunnable); new Thread() { @Override public void run() { try { //重连 client.reconnectBlocking(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); }
然后在需要的地方开启心跳检测:
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);//开启心跳检测
参考资料
https://www.jianshu.com/p/7b919910c892