java 即时通讯_JavaWebSocket让你轻松实现即时通讯

本文介绍了如何使用Java-WebSocket库来实现即时通讯功能,特别是直播弹幕场景。首先在build.gradle中添加依赖,接着开启网络权限。通过自定义WebSocketClient类,并重写onMessage等方法处理消息。当遇到WebSocket因超时自动关闭的问题,通过心跳检测和重连机制来保持连接。文章还提供了相关参考资料。
摘要由CSDN通过智能技术生成

5739155fbf7287ab1ff6fee3a35e7a70.png

前言

使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值