Android使用WebSocket

这篇具有很好参考价值的文章主要介绍了Android使用WebSocket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、WeoSocket的引入

在Android项目的build.gradle中加入:

implementation "org.java-websocket:Java-WebSocket:1.5.2"

Sync一下极氪将websocket引入我们这个项目

2、编码

  1. 首先创建一个类WebSocketServer 继承 WebSocket包提供的 WebSocketClient 类
public class WebSocketServer extends WebSocketClient {

    @Override
    protected void onSetSSLParameters(SSLParameters sslParameters) {
    
    }

    public WebSocketServer(URI uri) {
        super(uri, new Draft_6455());
    }

    @Override
    public void onOpen(ServerHandshake handshakedata) {
        Log.e("WebSocket", "connect");
    }

    @Override
    public void onMessage(String message) {
        Log.e("WebSocket", message);

    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        Log.e("WebSocket", reason);
    }

    @Override
    public void onError(Exception ex) {
        Log.e("WebSocket", ex.toString());
    }
}
  1. 创建一个service去实现我们刚刚创建的类
public class WebSocketService extends Service {

    private final static String TAG = "WebSocketClient";

    public static boolean isRunning = false;

    private URI uri;

    public WebSocketServer client;

    private WebSocketClientBinder mBinder = new WebSocketClientBinder();

    //设置intent用来向MainActivity传递消息修改UI
    private Intent intent = new Intent("com.caisang");

    //用于Activity和service通讯
    public class WebSocketClientBinder extends Binder {
        public WebSocketService getService() {
            return WebSocketService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        initSocketClient();
        //开启心跳检测
        mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (client != null && client.isOpen()) {
			//启动service时调用,可以检查websocket此时状态
        }
        return START_STICKY;
    }

    public static class GrayInnerService extends Service {

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            startForeground(GRAY_SERVICE_ID, new Notification());
            stopForeground(true);
            stopSelf();
            return super.onStartCommand(intent, flags, startId);
        }

        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    }

    @Override
    public void onDestroy() {
        closeConnect();
        LogUtils.w("ws被销毁");
        super.onDestroy();
    }

    private void initSocketClient() {
        URI uri = URI.create(Wsutil.ws + Wsutil.devicesID);
        Log.i(TAG,"正在连接服务:"+Wsutil.ws);
        client = new WebSocketServer(uri) {
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onMessage(String message) {
            //这个是我自己封装的消息类
                DeviceMessage deviceMessage = JSON.parseObject(message,DeviceMessage.class);
                LogUtil.e(TAG, "收到消息,消息内容是:" + deviceMessage );
                

                }
            }

            @Override
            public void onOpen(ServerHandshake handshakedata) {
                super.onOpen(handshakedata);
            }

            @Override
            public void onClose(int code, String reason, boolean remote) {时调用
                LogUtil.e(TAG, "onClose() 连接断开_reason:" + reason);

                mHandler.removeCallbacks(heartBeatRunnable);
                //开启心跳检测
                mHandler.postDelayed(heartBeatRunnable, CLOSE_RECON_TIME);
            }

            @Override
            public void onError(Exception ex) {
                LogUtil.e(TAG, "onError() 连接出错:" + ex.getMessage());

                mHandler.removeCallbacks(heartBeatRunnable);
                //开启心跳检测
                mHandler.postDelayed(heartBeatRunnable, CLOSE_RECON_TIME);
            }
        };
        connect();
    }

    private void connect() {
        new Thread() {
            @Override
            public void run() {
                try {
                    client.connectBlocking();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();

    }
    
    public void sendMsg(String msg) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (null != client && client.isOpen()) {
                    client.send(msg);
                }
            }
        }).start();
    }

    private void closeConnect() {
        try {
            if (null != client) {
                client.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client = null;
        }
    }

	//每隔10秒进行一次对长连接的心跳检测
    private static final long HEART_BEAT_RATE = 10 * 1000;
    private final Handler mHandler = new Handler();
    private final Runnable heartBeatRunnable = new Runnable() {
        @Override
        public void run() {
            if (client != null) {
                if (client.isClosed()) {
                    reconnectWs();
                }
            } else {
                //如果client已为空,重新初始化连接
                initSocketClient();
            }
            //每隔一定的时间,对长连接进行一次心跳检测
            mHandler.postDelayed(this, HEART_BEAT_RATE);
        }
    };

    private void reconnectWs() {
        mHandler.removeCallbacks(heartBeatRunnable);
        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    Log.e("Websocket", "开启重连");
                    client.reconnectBlocking();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

3.在需要的地方绑定和启动这个service文章来源地址https://www.toymoban.com/news/detail-552080.html

	private Context mContext;
	mContext = getApplication();
	//启动服务
    private void startWebSClientService() {
        Intent intent = new Intent(mContext, WebSocketService.class);
        startService(intent);
    }
    //绑定服务
    private void bindService() {
        Intent bindIntent = new Intent(mContext, WebSocketService.class);
        bindService(bindIntent, serviceConnection, BIND_AUTO_CREATE);
    }
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.e("MainActivity", "服务与活动成功绑定");
            WebSClientService = ((WebSocketService.WebSocketClientBinder) iBinder).getService();
            client = WebSClientService.client;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.e("MainActivity", "服务与活动成功断开");
        }
    };
    //取消服务绑定
    unbindService(serviceConnection);
  1. 启动整个项目,见到E/MainActivity: 服务与活动成功绑定,服务成功启动,完成

到了这里,关于Android使用WebSocket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android中okhttp的websocket的详细使用方法(加断线重连)

    介绍之类的就不多讲了,懒得讲也未必有别人整理的清晰,直接上代码 使用:

    2024年02月15日
    浏览(33)
  • Android笔记--WebSocket

           这一节了解一下WebSocket的用法,WebSocket是一种基于TCP的全双工通信协议,通过它可以在客户端和服务器之间建立一个持久的连接,实现实时的双向数据传输。它的主要功能特点是允许服务器主动向客户端推送信息,同时也允许客户端主动向服务器发送信息。用法如下

    2024年02月05日
    浏览(24)
  • 在安卓中使用WebSocket

    WebSocket是一种在Web浏览器和服务器之间进行实时双向通信的协议。与传统的HTTP请求-响应模型不同,WebSocket允许服务器主动向客户端推送数据,而不需要客户端发起请求。当然,发展到如今,WebSocket已经不再局限于Web浏览器了,也可以在移动应用、桌面应用上使用。 WebSocket的

    2024年02月09日
    浏览(27)
  • 使用WGCLOUD监测安卓(Android)设备的运行状态

    WGCLOUD是一款开源运维监控软件,除了能监控各种服务器、主机、进程应用、端口、接口、docker容器、日志、数据等资源 WGCLOUD还可以监测安卓设备,比如安卓手机、安卓设备等 我们只要下载对应的安卓客户端,部署运行即可,如下是下载链接 android(安卓)设备监测使用说明

    2024年02月15日
    浏览(37)
  • 使用ADB命令查询Android设备的安卓版本信息

    确保你已经安装了ADB并将其添加到系统的路径中。 连接你的Android设备到计算机,并确保启用了开发者选项和USB调试模式。你可以在设备的设置中找到这些选项。 打开终端(命令提示符或终端窗口)。 运行以下ADB命令来获取Android设备的安卓版本信息: 如果你希望获得更详细

    2024年02月08日
    浏览(40)
  • QT搭建Android编译环境及使用安卓虚拟机调试

    QT是可以创建Android APP的,同时生成apk提供安装。 而为了编译和生成apk,就需要为QT添加对应的支持包。 一、Android环境支持包下载 1、JAVA SE8 JDK JAVA SE8 JDK是JAVA环境的支持包,Android APP通常使用JAVA区编写,但是使用QT可以直接用C/C++,其实是QT将C/C++自动转换为了JAVA,最后用的也

    2024年02月14日
    浏览(44)
  • 使用SSH远程连接安卓手机Termux - Android手机服务器

    转载自cpolar极点云的文章:公网SSH远程连接Termux – 电脑使用安卓Termux 「无需公网IP」 使用安卓机跑东西的时候,屏幕太小,有时候操作不习惯。不过我们可以开启ssh,使用电脑PC端SSH远程连接手机termux。 本次教程主要实现在安卓手机termux上安装SSH,在电脑上通过SSH远程连接

    2024年02月07日
    浏览(56)
  • Android Studio配置adb使用WIFI连接手机调试安卓程序

    安装adb参考:https://www.linmeimei.top/2023/03/02/flutter-adb 手机设置 打开开发者模式(用HUAWEI举例) 【设置】→【关于手机】→【版本号】→ 连续点击5次即可进入开发者模式 打开USB调试 【设置】→【系统和更新】→【开发人员选项】→开启【USB调试】开关→开启【\\\"仅充电\\\"模式下允许

    2024年02月04日
    浏览(52)
  • 公网使用SSH远程连接安卓手机Termux - Android手机服务器

    转载自cpolar极点云的文章:公网SSH远程连接Termux – 电脑使用安卓Termux 「无需公网IP」 使用安卓机跑东西的时候,屏幕太小,有时候操作不习惯。不过我们可以开启ssh,使用电脑PC端SSH远程连接手机termux。 本次教程主要实现在安卓手机termux上安装SSH,在电脑上通过SSH远程连接

    2024年02月07日
    浏览(44)
  • 在Android Studio上使用Monkey工具对安卓应用进行压力测试

    2–pct-trackball 调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)–(轨迹球) 3–pct-nav 调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成) 4–pct-majornav 调整“主要”导航事件的百分比(这些导航事件通常引发图

    2024年04月15日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包