Android中 使用 WebSocket 实现消息通信

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

private String action;

/**

  • 请求体

*/

private RequestChild req;

/**

  • 请求次数

*/

private transient int reqCount;

/**

  • 超时的时间

*/

private transient int timeOut;

public Request() {

}

public Request(String action, int reqCount, int timeOut, RequestChild req) {

this.action = action;

this.req = req;

this.reqCount = reqCount;

this.timeOut = timeOut;

}

public static class Builder {

//action 请求类型

private String action;

//请求子类数据 按照具体业务划分

private RequestChild req;

//请求次数 便于重试

private int reqCount;

//超时时间

private int timeOut;

public Builder action(String action) {

this.action = action;

return this;

}

public Builder req(RequestChild req) {

this.req = req;

return this;

}

public Builder reqCount(int reqCount) {

this.reqCount = reqCount;

return this;

}

public Builder timeOut(int timeOut) {

this.timeOut = timeOut;

return this;

}

public Request build() {

return new Request(action, reqCount, timeOut, req);

}

}

}

public class RequestChild {

/**

  • 设备类型

*/

private String clientType;

/**

  • 用于用户注册的id

*/

private String id;

public RequestChild(String clientType, String id) {

this.clientType = clientType;

this.id = id;

}

public RequestChild() {

}

public static class Builder {

private String clientType;

private String id;

public RequestChild.Builder setClientType(String clientType) {

this.clientType = clientType;

return this;

}

public RequestChild.Builder setId(String id) {

this.id = id;

return this;

}

public RequestChild build() {

return new RequestChild(clientType, id);

}

}

}

我们添加一个发送请求的方法如下:

/**

  • 发送请求

  • @param request 请求体

  • @param reqCount 请求次数

  • @param requestListern 请求回调

*/

private void senRequest(Request request, final int reqCount, final RequestListern requestListern) {

if (!isNetConnect()) {

requestListern.requestFailed(“网络未连接”);

return;

}

}

请求回调如下所示

public interface RequestListern {

/**

  • 请求成功

*/

void requestSuccess();

/**

  • 请求失败

  • @param message 请求失败消息提示

*/

void requestFailed(String message);

}

接着我们要把请求放在超时队列中,新建超时任务类,对应的分别是请求参数、请求回调、任务调度

public class TimeOutTask {

/**

  • 请求主体

*/

private Request request;

/**

  • 通用返回

*/

private RequestCallBack requestCallBack;

/**

  • r任务

*/

private ScheduledFuture scheduledFuture;

public TimeOutTask(Request request,

RequestCallBack requestCallBack,

ScheduledFuture scheduledFuture) {

this.request = request;

this.requestCallBack = requestCallBack;

this.scheduledFuture = scheduledFuture;

}

public ScheduledFuture getScheduledFuture() {

return scheduledFuture;

}

public void setScheduledFuture(ScheduledFuture scheduledFuture) {

this.scheduledFuture = scheduledFuture;

}

public Request getRequest() {

return request;

}

public void setRequest(Request request) {

this.request = request;

}

public RequestCallBack getRequestCallBack() {

return requestCallBack;

}

public void setRequestCallBack(RequestCallBack requestCallBack) {

this.requestCallBack = requestCallBack;

}

}

RequestCallBack是超时任务的回调,只是比请求回调多了个超时,因为超时的处理机制是一样的,所以这里我们没必要将超时回调到请求中

public interface RequestCallBack {

/**

  • 请求成功

*/

void requestSuccess();

/**

  • 请求失败

  • @param request 请求体

  • @param message 请求失败的消息

*/

void requestFailed(String message, Request request);

/**

  • 请求超时

  • @param request 请求体

*/

void timeOut(Request request);

}

/**

  • 添加超时任务

*/

private ScheduledFuture enqueueTimeout(final Request request, final long timeout) {

Log.d(TAG, " " + “enqueueTimeout: 添加超时任务类型为:” + request.getAction());

return executor.schedule(new Runnable() {

@Override

public void run() {

TimeOutTask timeoutTask = callbacks.remove(request.getAction());

if (timeoutTask != null) {

timeoutTask.getRequestCallBack().timeOut(timeoutTask.getRequest());

}

}

}, timeout, TimeUnit.MILLISECONDS);

}

超时任务的方法 是通过任务调度定时调用,请求成功后我们会把超时任务移除,当到了超时时间时,任务还存在就说明任务超时了。

每次的任务我们以action为键值存在hashMap中

private Map<String, CallbackWrapper> callbacks = new HashMap<>();

将任务放入超时任务代码如下所示:

final ScheduledFuture timeoutTask = enqueueTimeout(request, request.getTimeOut());

final RequestCallBack requestCallBack = new RequestCallBack() {

@Override

public void requestSuccess() {

requestListern.requestSuccess();

}

@Override

public void requestFailed(String message, Request request) {

requestListern.requestFailed(message);

}

@Override

public void timeOut(Request request) {

timeOutHanlder(request);

}

};

callbacks.put(request.getAction(),

new CallbackWrapper(request, requestCallBack, timeoutTask));

一般而言,任务超时都是由于连接原因导致,所以我们这里可以尝试重试一次,如果还是超时,通过 timeOutHanlder(request);方法 进行重新连接,重连代码和连接代码一样,这里就省略了,做好这步操作,我们就可以发送消息了。

/**

  • 超时任务

*/

private void timeOutHanlder(Request requset) {

setStatus(WsStatus.CONNECT_FAIL);

//这里假装有重连

Log.d(TAG, “timeOutHanlder: 请求超时 准备重连”);

}

到这里我们的流程基本可以走通了。

心跳

首先我们要了解下心跳的作用是什么,心跳是在连接成功后,通过固定的间隔时间向服务器发送询问,当前是否还在线,有很多人说心跳失败我们就重连,成功就继续心跳,但是这里要注意的是,我们一般是收不到心跳失败回调的,心跳也是向服务器发送数据,所以我们要将所有的主动请求都放在超时任务队列中,

所以对websocket来说 请求结果有三种:成功、失败、超时,对于用户 只有成功、失败即可。

至于心跳、注册等请求发送的数据是什么,这就得看我们与服务端定的协议是什么样了,通常来说 分为action 和 requestBody,协议格式我们再第二步已经封装好了,这里我们以心跳任务为例验证上面的封装。

/**

  • 心跳

*/

void keepAlive() {

Request request = new Request.Builder()

.reqCount(0)

.timeOut(REQUEST_TIMEOUT)

.action(ACTION_KEEPALIVE).build();

WsManager.getWsManger().senRequest(request, request.getReqCount() + 1, new RequestListern() {

@Override

public void requestSuccess() {

Log.d(TAG, “requestSuccess: 心跳发送成功了”);

}

@Override

public void requestFailed(String message) {

}

});

}

我们每间隔10s中开启一次心跳任务

/**

  • 开始心跳

*/

public void startKeepAlive() {

mHandler.postDelayed(mKeepAliveTask, HEART_BEAT_RATE);

}

/**

  • 心跳任务

*/

private Runnable mKeepAliveTask = new Runnable() {

@Override

public void run() {

keepAlive();

mHandler.removeCallbacks(mKeepAliveTask);

mHandler.postDelayed(mKeepAliveTask, HEART_BEAT_RATE);

}

};

为了便于操作演示,在主页面上加个按钮 ,点击按钮调用startKeepAlive方法,运行如下所示:

android websocket聊天,程序员,android,websocket,网络协议

我们可以看到心跳返回的statue是300 不成功,5秒之后走到了请求超时的方法中,所以如果状态返回成功的话,我们需要回调给调用者

/**

  • 处理 任务回调

  • @param action 请求类型

*/

void disPatchCallbackWarp(String action, boolean isSuccess) {

CallbackWrapper callBackWarp = callbacks.remove(action);

if (callBackWarp == null) {

Logger.d(TAG+" "+ “disPatchCallbackWarp: 任务队列为空”);

} else {

callBackWarp.getScheduledFuture().cancel(true);

if (isSuccess) {

callBackWarp.getRequestCallBack().requestSuccess();

} else {

callBackWarp.getRequestCallBack().requestFailed(“”, new Request());

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

android websocket聊天,程序员,android,websocket,网络协议

android websocket聊天,程序员,android,websocket,网络协议

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

android websocket聊天,程序员,android,websocket,网络协议

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

android websocket聊天,程序员,android,websocket,网络协议

最后

文章到这里就结束了,如果觉得对你有帮助可以点个赞哦,如果有需要前端校招面试题PDF完整版的朋友可以点击这里即可获取,包括答案解析。

android websocket聊天,程序员,android,websocket,网络协议

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-YRC52lOt-1711650799331)]

[外链图片转存中…(img-3hCy01pL-1711650799332)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-H7N4DtBs-1711650799332)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

android websocket聊天,程序员,android,websocket,网络协议

最后

文章到这里就结束了,如果觉得对你有帮助可以点个赞哦,如果有需要前端校招面试题PDF完整版的朋友可以点击这里即可获取,包括答案解析。

[外链图片转存中…(img-r8e7irvH-1711650799332)]文章来源地址https://www.toymoban.com/news/detail-844209.html

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

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

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

相关文章

  • android开发使用OkHttp自带的WebSocket实现IM功能

    目录 一、背景 二、在项目中添加依赖包 三、框架调用 1、配置OkHttpClient  2、调用Url,构建WebSocket请求 3、建立连接 4、使用WebSocket对象发送消息     android app开发经常会有IM需求,很多新手不晓得如何入手,难点在于通讯不中断。其实android发展到今天,很多技术都很完善,有

    2024年02月08日
    浏览(40)
  • 前端实现消息推送、即时通信、SSE、WebSocket、http简介

    服务端主动向客户端推送消息,使客户端能够即时接收到信息。 场景 页面接收到点赞,消息提醒 聊天功能 弹幕功能 实时更新数据功能 短轮询 浏览器(客户端)每隔一段时间向服务器发送http请求,服务器端在收到请求后,不论是否有数据更新,都直接进行响应。 本质:客

    2024年02月16日
    浏览(43)
  • Android使用WebSocket

    在Android项目的build.gradle中加入: Sync一下极氪将websocket引入我们这个项目 首先创建一个类WebSocketServer 继承 WebSocket包提供的 WebSocketClient 类 创建一个service去实现我们刚刚创建的类 3.在需要的地方绑定和启动这个service 启动整个项目,见到 E/MainActivity: 服务与活动成功绑定 ,服务

    2024年02月15日
    浏览(34)
  • webSocket及使用webSocket实现实时聊天通信

    webSocket在开始的时候依旧使用的是http协议,只不过后面保持tcp持久链接,是一种全双工通信。webSockets和http很像,它的请求url用的是ws、wss,对应http、https 初始化 npm init -y 安装ws依赖 npm i --save ws 写服务器代码 服务器启动 node server.js 配置前端代码,即告诉浏览器这个请求不要

    2023年04月11日
    浏览(40)
  • Java 实现使用 Websocket 发送消息

    需求背景:之前做了个楼栋房间数量出租了多少,需要在数据大屏上实时展示 解决方案:以切面拦截出租接口,当有房间出租时重新查询相关数据,封装好用websocket实时传送前端展示 提示:以下是本篇文章正文内容,下面案例可供参考 WebSocket 是一种在单个TCP连接上进行全双

    2024年03月27日
    浏览(43)
  • Java使用websocket实现消息实时通知

    博客仅做学习记录使用。 做项目中遇到这样一个实时通知需求,因为第一次接触这个,期间查了很多资料,看了很多博客,最后实现功能,查询的博客太多,就不一一放出来了,感谢各位大佬。 websocket方式主要代码来源于这个大佬的博客: https://blog.csdn.net/moshowgame/article/d

    2024年02月08日
    浏览(65)
  • 使用Spring WebSocket实现实时通信功能

    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础

    2024年02月09日
    浏览(37)
  • 记录--你还在使用websocket实现实时消息推送吗?

    在日常的开发中,我们经常能碰见服务端需要主动推送给客户端数据的业务场景,比如数据大屏的实时数据,比如消息中心的未读消息,比如聊天功能等等。 本文主要介绍SSE的使用场景和如何使用SSE。 我们常规实现这些需求的方案有以下三种 轮询 websocket SSE 在很久很久以前

    2024年02月19日
    浏览(40)
  • 使用vue3简单实现WebSocket通信

    关于WebSocket通信的简单介绍: 握手阶段:在建立WebSocket连接之前,客户端需要发送一个HTTP请求到服务器,请求升级为WebSocket协议。这个过程称为握手(Handshake)。如果服务器支持WebSocket协议,它将返回带有特定标头的HTTP响应,表示握手成功。 建立连接:客户端收到服务器的

    2024年02月16日
    浏览(37)
  • 集成websocket实现实时通信(ruoyi 使用笔记)

    Websocket 是一种基于 TCP 协议的全双工通信协议,它使得客户端和服务器之间可以进行实时的双向通信。相对于传统的 HTTP 协议只能通过客户端发送请求,然后等待服务端的响应,WebSocket 可以让客户端和服务器在任何时候都可以相互发送消息,这种实时通信的方式非常适合需要

    2024年02月07日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包