当前位置:   article > 正文

Android程序中使用websocket通信(java-websocket)_android java-websocket

android java-websocket

使用场景:需要和硬件保持实时通信

为什么用websocket:在以前的消息推送机制中,用的都是http轮询(polling),做一个定时器定时向服务器发送请求,这种方式是非常消耗资源的,因为它本质还是http请求,而且显得非常笨拙。而WebSocket 在浏览器和服务器完成一个握手的动作,在建立连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。

1.引入java-websocket

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

2.初始化连接

  1. /**
  2. * 初始化websocket连接
  3. */
  4. private void initSocketClient() {
  5. URI uri = URI.create(WSUri);
  6. client = new JWebSocketClient(uri) {
  7. //可以获取到一些服务器推送过来的消息
  8. @Override
  9. public void onMessage(String message) {
  10. JSONObject jsonObject = JSON.parseObject(message);
  11. }
  12. @Override
  13. public void onOpen(ServerHandshake handshakedata) {
  14. super.onOpen(handshakedata);
  15. Log.e("JWebSocketClientService", "websocket连接成功");
  16. msgData sn = new msgData();
  17. sn.setSn(getDeviceSN());
  18. msg obj = new msg();
  19. obj.setCommand("init");
  20. obj.setData(sn);
  21. String str = JSON.toJSONString(obj);
  22. Log.e(TAG, "-----" + JSON.toJSONString(obj));
  23. sendMsg(str);
  24. heartBeatRunnable.run();
  25. }
  26. @Override
  27. public void onError(Exception ex) {
  28. super.onError(ex);
  29. Log.e(TAG, "websocket连接错误:" + ex);
  30. }
  31. @Override
  32. public void onClose(int code, String reason, boolean remote) {
  33. super.onClose(code, reason, remote);
  34. Log.e(TAG, "websocket断开连接:·code:" + code + "·reason:" + reason + "·remote:" + remote);
  35. }
  36. };
  37. connect();
  38. }

3.连接websocket

先判断是否已经连接过了,连接过了什么也不做

  1. /**
  2. * 连接websocket
  3. */
  4. private void connect() {
  5. if (client.isOpen()) {
  6. return;
  7. }
  8. client.connect();
  9. }

4.发送消息

我们可以自定义一些消息(msg)发送给服务器

  1. /**
  2. * 发送消息
  3. *
  4. * @param msg
  5. */
  6. public void sendMsg(String msg) {
  7. if (null != client) {
  8. client.send(msg);
  9. }
  10. }

5.重连

由于很多因素甚至是外部因素的影响,可能会导致我们建立的ws连接会断连这个时候我们需要重新连接上服务器

  1. /**
  2. * 开启重连
  3. */
  4. private void reconnectWs() {
  5. Log.e("", "正在重连");
  6. initSocketClient();
  7. }

6.心跳检测

心跳检测是判断有没有断连的重要方法,也能比较严谨的让后台判断硬件的在线状态,通过判断client的状态来决定是否重新建立连接,如下代码,如果判断不是关闭状态,我会发送一些信息给服务器,里边包括硬件的sn编号和一个“ping”的字符串,来告诉后台这台设备还“活着”。

  1. private static final long HEART_BEAT_RATE = 15 * 1000;//每隔15秒进行一次对长连接的心跳检测
  2. private Handler mHandler = new Handler();
  3. //心跳检测
  4. private Runnable heartBeatRunnable = new Runnable() {
  5. @Override
  6. public void run() {
  7. mHandler.removeCallbacks(heartBeatRunnable);
  8. if (client != null) {
  9. if (client.isClosed()) {
  10. Log.e(TAG, "关闭状态");
  11. reconnectWs();//心跳机制发现断开开启重连
  12. } else {
  13. //发送消息
  14. msgData sn = new msgData();
  15. sn.setSn(getDeviceSN());
  16. msg obj = new msg();
  17. obj.setData(sn);
  18. if (client.isOpen()) {
  19. obj.setCommand("ping");
  20. Log.e("", "❤");
  21. sendMsg(JSON.toJSONString(obj));
  22. } else {
  23. Log.e(TAG, "异常");
  24. reconnectWs();//心跳机制发现断开开启重连
  25. }
  26. }
  27. } else {
  28. Log.e("", "没有初始化");
  29. //如果client已为空,重新初始化连接
  30. initSocketClient();
  31. }
  32. mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
  33. }
  34. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/450199
推荐阅读
相关标签
  

闽ICP备14008679号