iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >WebSocket中怎么利用OkHttp实现长连接
  • 151
分享到

WebSocket中怎么利用OkHttp实现长连接

2024-04-02 19:04:59 151人浏览 八月长安
摘要

websocket中怎么利用OkHttp实现长连接,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。WebSocket介绍先简单介绍下WEBSoc

websocket中怎么利用OkHttp实现长连接,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

WebSocket介绍

先简单介绍下WEBSocket。我们都知道Http是处于应用层的一个通信协议,但是只支持单向主动通信,做不到服务器主动向客户端推送消息。而且Http是无状态的,即每次通信都没有关联性,导致跟服务器关系不紧密。

为了解决和服务器长时间通信的痛点呢,HTML5规范引出了WebSocket协议(知道这名字咋来的吧,人家html5规范引出的,随爸姓),是一种建立在tcp协议基础上的全双工通信的协议。他跟Http同属于应用层协议,下层还是需要通过TCP建立连接。

但是,WebSocket在TCP连接建立后,还要通过Http进行一次握手,也就是通过Http发送一条GET请求消息给服务器,告诉服务器我要建立WebSocket连接了,你准备好哦,具体做法就是在头部信息中添加相关参数。然后服务器响应我知道了,并且将连接协议改成WebSocket,开始建立长连接。

这里贴上请求头和响应头信息,从网上找了一张图:

WebSocket中怎么利用OkHttp实现长连接

3851594110877_.pic.jpg

简单说明下参数:

  • URL一般是以ws或者wss开头,ws对应Websocket协议,wss对应在TLS之上的WebSocket。类似于Http和https的关系。

  • 请求方法为GET方法。

  • Connection:Upgrade,表示客户端要连接升级,不用Http协议。

  • Upgrade:websocket, 表示客户端要升级建立Websocket连接。

  • Sec-Websocket-Key:key, 这个key是随机生成的,服务器会通过这个参数验证该请求是否有效。

  • Sec-WebSocket-Version:13, websocket使用的协议,一般就是13。

  • Sec-webSocket-Extension:permessage-deflate,客户端指定的一些扩展协议,比如这里permessage-deflate就是WebSocket的一种压缩协议。

  • 响应码101,表示响应协议升级,后续的数据交互都按照Upgradet指定的WebSocket协议来。

OkHttp实现

添加OkHttp依赖

implementation("com.squareup.okhttp3:okhttp:4.7.2")

实现代码

首先是初始化OkHttpClient和WebSocket实例:

 public void init() {     mWbSocketUrl = "ws://echo.websocket.org";     mClient = new OkHttpClient.Builder()             .pingInterval(10, TimeUnit.SECONDS)             .build();     Request request = new Request.Builder()             .url(mWbSocketUrl)             .build();     mWebSocket = mClient.newWebSocket(request, new WsListener()); }

这里主要是配置了OkHttp的一些参数,以及WebSocket的连接地址。其中newWebSocket方法就是进行WebSocket的初始化和连接。

这里要注意的点是pingInterval方法的配置,这个方法主要是用来设置WebSocket连接的保活。相信做过长连接的同学都知道,一个长连接一般要隔几秒发送一条消息告诉服务器我在线,而服务器也会回复一个消息表示收到了,这样就确认了连接正常,客户端和服务器端都在线。

如果服务器没有按时收到这个消息那么服务器可能就会主动关闭这个连接,节约资源。客户端没有正常收到这个返回的消息,也会做一些类似重连的操作,所以这个保活消息非常重要。

我们称这个消息叫作心跳包,一般用PING,PONG表示,像乒乓球一样,一来一回。所以这里的pingInterval就是设置心跳包发送的间隔时间,设置了这个方法之后,OkHttp就会自动帮我们发送心跳包事件,也就是ping包。当间隔时间到了,没有收到pong包的话,监听事件中的onFailure方法就会被调用,此时我们就可以进行重连。

但是由于实际业务需求不一样,以及okhttp中心跳包事件给予我们权限较少,所以我们也可以自己完成心跳包事件,即在WebSocket连接成功之后,开始定时发送ping包,在下一次发送ping包之前检查上一个pong包是否收到,如果没收到,就视为异常,开始重连。感兴趣的同学可以看看文末的相关源码

建立连接后,我们就可以正常发送和读取消息了,也就是在上文WsListener监听事件中表现:

//监听事件,用于收消息,监听连接的状态 class WsListener extends WebSocketListener {     @Override     public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) {         super.onClosed(webSocket, code, reason);     }      @Override     public void onClosing(@NotNull WebSocket webSocket, int code, @NotNull String reason) {         super.onClosing(webSocket, code, reason);     }      @Override     public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, @Nullable Response response) {         super.onFailure(webSocket, t, response);     }      @Override     public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) {         super.onMessage(webSocket, text);         Log.e(TAG, "客户端收到消息:" + text);         onWSDataChanged(DATE_NORMAL, text);        //测试发消息         webSocket.send("我是客户端,你好啊");     }      @Override     public void onMessage(@NotNull WebSocket webSocket, @NotNull ByteString bytes) {         super.onMessage(webSocket, bytes);     }      @Override     public void onOpen(@NotNull WebSocket webSocket, @NotNull Response response) {         super.onOpen(webSocket, response);         Log.e(TAG,"连接成功!");     } }   //发送String消息 public void send(final String message) {     if (mWebSocket != null) {         mWebSocket.send(message);     } }   public void send(final ByteString message) {     if (mWebSocket != null) {         mWebSocket.send(message);     } }      //主动断开连接 public void disconnect(int code, String reason) {     if (mWebSocket != null)         mWebSocket.close(code, reason); }

这里要注意,回调的方法都是在子线程回调的,如果需要更新UI,需要切换到主线程。

基本操作就这么多,还是很简单的吧,初始化Websocket——连接——连接成功——收发消息。

其中WebSocket类是一个操作接口,主要提供了以下几个方法

  • send(text: String)发送一个String类型的消息

  • send(bytes: ByteString) 发送一个二进制类型的消息

  • close(code: Int, reason: String?)关闭WebSocket连接

如果有同学想测试下WebSocket的功能但是又没有实际的服务器,怎么办呢?其实OkHttp官方有一个MockWebSocket服务,可以用来模拟服务端,下面我们一起试一下:

模拟服务器

首先集成MockWebSocket服务库:

implementation 'com.squareup.okhttp3:mockwebserver:4.7.2'

然后就可以新建MockWebServer,并加入MockResponse作为接收消息的响应。

MockWebServer mMockWebServer = new MockWebServer();   MockResponse response = new MockResponse()           .withWebSocketUpgrade(new WebSocketListener() {               @Override               public void onOpen(@NotNull WebSocket webSocket, @NotNull Response response) {                   super.onOpen(webSocket, response);                   //有客户端连接时回调                   Log.e(TAG, "服务器收到客户端连接成功回调:");                   mWebSocket = webSocket;                   mWebSocket.send("我是服务器,你好呀");               }                @Override               public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) {                   super.onMessage(webSocket, text);                    Log.e(TAG, "服务器收到消息:" + text);               }                @Override               public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) {                   super.onClosed(webSocket, code, reason);                   Log.e(TAG, "onClosed:");               }           });    mMockWebServer.enqueue(response);

这里服务器端在收到客户端连接成功消息后,给客户端发送了一条消息。要注意的是这段代码要在子线程执行,因为主线程不能进行网络操作。

然后就可以去初始化Websocket客户端了:

//获取连接url,初始化websocket客户端 String websocketUrl = "ws://" + mMockWebServer.getHostName() + ":" + mMockWebServer.getPort() + "/"; WSManager.getInstance().init(websocketUrl);

看完上述内容,你们掌握WebSocket中怎么利用OkHttp实现长连接的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网html频道,感谢各位的阅读!

--结束END--

本文标题: WebSocket中怎么利用OkHttp实现长连接

本文链接: https://www.lsjlt.com/news/77183.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • WebSocket中怎么利用OkHttp实现长连接
    WebSocket中怎么利用OkHttp实现长连接,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。WebSocket介绍先简单介绍下WebSoc...
    99+
    2024-04-02
  • 微信小程序中怎么使用WebSocket实现长连接
    这篇文章主要讲解了“微信小程序中怎么使用WebSocket实现长连接”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信小程序中怎么使用WebSocket实现长连接”吧!项目使用的技术栈数据请...
    99+
    2023-06-26
  • Android中怎么利用OKHTTP实现单例
    本篇文章为大家展示了Android中怎么利用OKHTTP实现单例,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android OKHTTP的单例和再封装的实例public class&nb...
    99+
    2023-05-30
    android okhttp
  • Vue+WebSocket页面实时刷新长连接的实现
    最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死。。。 与后台人员讨论过后决定使用h5...
    99+
    2024-04-02
  • 如何使用Go语言实现Websocket长连接保持
    如何使用Go语言实现Websocket长连接保持Websocket是HTML5提供的一种协议,可以实现服务器与客户端之间的双向通信。在实际开发中,很多场景需要保持长连接,以便实时推送数据或实现即时通讯功能。本文将介绍如何使用Go语言实现We...
    99+
    2023-12-14
    Go语言 websocket 长连接保持
  • 怎么利用html5的websocket实现websocket聊天室
    小编给大家分享一下怎么利用html5的websocket实现websocket聊天室,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!     什么是websocket ...
    99+
    2024-04-02
  • C#的Websocket怎么连接实现wss协议
    本篇内容主要讲解“C#的Websocket怎么连接实现wss协议”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#的Websocket怎么连接实现wss协议”吧!一、什么是Websocket?W...
    99+
    2023-06-30
  • Java中怎么利用JDBC实现数据库连接
    Java中怎么利用JDBC实现数据库连接,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 JDBC:...
    99+
    2024-04-02
  • python中怎么用socket实现协议TCP长连接框架
    这篇文章主要介绍“python中怎么用socket实现协议TCP长连接框架”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python中怎么用socket实现协议TCP长连接框架”文章能帮助大家解决问...
    99+
    2023-06-29
  • 怎么在HTML5中利用WebSocket实现点对点聊天
    这期内容当中小编将会给大家带来有关怎么在HTML5中利用WebSocket实现点对点聊天,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先在系统启动的时候调用InitServlet方法public&nbs...
    99+
    2023-06-09
  • 怎么在python中利用第三方模块实现连接
    怎么在python中利用第三方模块实现连接?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、...
    99+
    2023-06-14
  • ADO.Net中怎么利用连接池连接字符串
    ADO.Net中怎么利用连接池连接字符串,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。说了这么多ADO.Net连接池的相关注释,那我们什么时候需要使用到Conn...
    99+
    2023-06-17
  • nodejs中怎么利用websocket实现一个实时聊天系统
    nodejs中怎么利用websocket实现一个实时聊天系统,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。client.html:<!D...
    99+
    2024-04-02
  • 怎么在SpringBoot中利用WebSocket实现一个群聊功能
    本篇文章为大家展示了怎么在SpringBoot中利用WebSocket实现一个群聊功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。消息群发创建新项目:添加依赖:<dependency>...
    99+
    2023-06-06
  • 怎么在Nginx中实现反向代理并支持长连接
    怎么在Nginx中实现反向代理并支持长连接?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言Nginx upstream与后端的连接默认为短连接,通过HTTP/...
    99+
    2023-06-08
  • Node中怎么利用WebSocket实现多文件下载功能
    这篇文章将为大家详细讲解有关Node中怎么利用WebSocket实现多文件下载功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。列表下载列表本文地址仓库:h...
    99+
    2024-04-02
  • 怎么使用PHP实现长链接
    这篇文章主要介绍了怎么使用PHP实现长链接的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用PHP实现长链接文章都会有所收获,下面我们一起来看看吧。长链接(Long Connection),也称为持久连接(...
    99+
    2023-07-05
  • HTML 5 中怎么利用WebSocket实现实时视频文字传输
    这篇文章给大家介绍HTML 5 中怎么利用WebSocket实现实时视频文字传输,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。轮询:这是最早的一种实现实时 Web 应用的方案。客户端以...
    99+
    2024-04-02
  • Android中怎么利用item实现长按删除功能
    Android中怎么利用item实现长按删除功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一般写完之后都会调用 public void&...
    99+
    2023-05-30
    android item
  • 怎么在Python中利用Telnet实现自动连接检测密码
    这篇文章给大家介绍怎么在Python中利用Telnet实现自动连接检测密码,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。# encoding=utf-8import telnetlibimport&...
    99+
    2023-06-14
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作