SignalR ——Android实践
SignalR 的版本:aspnetcore-2.2, Java SignalR-1.0.0
一、先说几个点
1、我使用SignalR的时候服务器使用的是自签名的HTTPS证书,所以OkHttp是无法直接解析的,会报错。需要修改SignalR里面OkHttp部分的源码,让其信任所有的HTTPS连接。当然,我这个项目是在内部网络里面使用的,所以才直接对信任了所有的HTTPS连接。
2、还有SignalR的版本问题,服务端的版本和客户端的版本一定要匹配。我刚开始做的时候服务端是不知道用的哪个版本的,也没给我说清楚。我是直接按照微软官网的SignalR的文档来写的,但是与后台对接的时候却连不上,最后后台是换成了我的那个客户端对应的SignalR的服务器版本才连接成功的。
3、SignalR的引入
如果不需要对HTTPS进行全部信任的话可以直接引入微软官方的SignalR的Java版SDK
//gradle
implementation 'com.microsoft.signalr:signalr:1.0.0'
如果需要的话就可以下载我修改过的SignalR,主要就是对里面的OkHttp加个一个Https的全部信任。
https://github.com/lfork/androiddemo/signalr
二、相关代码(Kotlin)
建立连接
关键类com.microsoft.signalr.HubConnection和com.microsoft.signalr.HubConnectionBuilder
val hubConnection = HubConnectionBuilder.create(serverUrl).build()hubConnection.start().blockingAwait()
注意需要调用blockingAwait()来等待连接成功,我之前写的时候没有加,然后在调用 hubConnection.start()后直接就调用了向服务器发送消息的方法,这样子会发送失败。因为你连接都没建立好,所以要先等下。
关闭连接
hubConnection.stop()
对被动关闭进行监听(比如网络异常)
hubConnection.onClosed {
}
客户端调用服务端方法
/*** Invokes a hub method on the server using the specified method name.* Does not wait for a response from the receiver.** @param method The name of the server method to invoke.* @param args The arguments to be passed to the method.*/public void send(String method, Object... args)
从SignalR源码可以看到,我们只需要把服务端注册好的方法名和参数传递进行即可
eg
hubConnection.send("SendMessageAsync", "" + "连接测试", "test")
服务端调用客户端方法
客户端需要在hubConnection对象执行start()方法之前对服务端需要调用的方法进行注册。然后就可以接收服务端的消息了。
①删除用户
//定义处理用户删除的action(方法体)val deleteAction = { id: String ->Log.d("SignalRSyncTask", "删除用户 $id")//doSomthing()Unit}//对action进行注册
//第一个参数是对方法名的注册,第二个参数相当于方法体,第三个参数就是客户端注册方法的参数了,
//我们可以看到deleteAction的lambda里面写了一个id:String。
hubConnection.on("DeleteUser", deleteAction, String::class.java)
②添加或者更新用户
//定义处理相关的action(方法体)
val addOrUpdateAction = { userInfoModel: User ->Log.d("SignalRSyncTask", "添加或者更新用户 ${userInfoModel.id}")userInfoChangedListenerList.forEach {it.userAddedOrUpdated(userInfoModel)}Unit
}//对action进行注册
hubConnection?.on("AddOrUpdateUser", addOrUpdateAction, User::class.java)
完整代码参考
代码里面还维护了一个监听,开启signalR的时候可以进行监听的注册,如果服务端有调用客户端方法的话就会进行提醒
import android.util.Log
import com.lfork.frtest.FRApplication
import com.lfork.frtest.data.userinfo.User
import com.lfork.frtest.syncservice.tasklistener.UserInfoChangedListener
import com.microsoft.signalr.HubConnection
import com.microsoft.signalr.HubConnectionBuilder
import java.lang.Exception/*** Created by L.Fork** @author lfork@vip.qq.com* @date 2019/01/28 18:01*/
class SignalRSyncTask {private var hubConnection: HubConnection? = nullprivate var userInfoChangedListenerList = ArrayList<UserInfoChangedListener>()fun start(serverUrl:String) {FRApplication.mThreadPool?.execute {hubConnection = HubConnectionBuilder.create(serverUrl).build()hubConnection?.onClosed {close() }val connectionTestAction = { name: String, message: String ->Log.d("SignalRSyncTask", "SignalR 连接成功 $name - $message")Unit}val addOrUpdateAction = { userInfoModel: User ->Log.d("SignalRSyncTask", "添加或者更新用户 ${userInfoModel.id}")userInfoChangedListenerList.forEach {it.userAddedOrUpdated(userInfoModel)}Unit}val deleteAction = { id: String ->Log.d("SignalRSyncTask", "删除用户 $id")userInfoChangedListenerList.forEach {it.userDeleted(id.toInt())}Unit}hubConnection?.on("ReciveMessage",connectionTestAction,String::class.java,String::class.java)hubConnection?.on("AddOrUpdateUser", addOrUpdateAction, User::class.java)hubConnection?.on("DeleteUser", deleteAction, String::class.java)try {//This is test blocking callhubConnection?.start()?.blockingAwait()hubConnection?.send("SendMessageAsync", "" + "连接测试", "test")} catch (e:Exception){e.printStackTrace()}}}fun addUserInfoChangedListener(userInfoChangedListener: UserInfoChangedListener) {userInfoChangedListenerList.add(userInfoChangedListener)}fun close() {userInfoChangedListenerList.clear()hubConnection?.stop()}}
三、参考文档
Microsoft官方参考文档
作者:lfork
原文地址: https://www.jianshu.com/p/43c79a7d0e3a
SignalR ——Android实践相关推荐
- android静默卸载,Android实践 -- Android静默安装和卸载
App的静默安装和卸载 Android系统本身提供了安装卸载功能,但是api接口是@hide的,不是公开的接口,所以在应用级别 是无法实现静默安装和卸载的,要实现静默安装和卸载需要是系统应用,要有系统 ...
- Android 系统(194)---Android实践 -- 设置系统日期时间和时区
Android实践 -- 设置系统日期时间和时区 转自:https://www.cnblogs.com/Free-Thinker/p/6627813.html 设置系统日期时间和时区 设置系统的日期时 ...
- Android 实践:做一款可用的天气 APP
可能很多人会问:之前已经写过一篇博文来介绍怎么做一款简单的新闻APP(http://blog.csdn.net/yiwei12/article/details/71249628),为什么还要专门一篇来 ...
- Android实践--模拟器的加度的快感
Android---如何提高模拟器的速度 做Android开发的程序猿们,很多人心中有一纠结:"Android模拟器怎么这么慢啊,用自己的爱机测试有点小小不舍",谷歌推出的adt- ...
- React Native for Android 实践 — 实现知乎日报客户端
React Native for Android 的发布,对一个 Android 开发者来说还是有相当的吸引力的.通过前面这篇博客:React Native for Android 入门老虎好不容易入 ...
- Android实践--如何提高Android模拟器的运行速度
Android---如何提高模拟器的速度 做Android开发的程序猿们,很多人心中有一纠结:"Android模拟器怎么这么慢啊,用自己的爱机测试有点小小不舍",谷歌推出的adt- ...
- Android实践 -- 监听应用程序的安装、卸载
监听应用程序的安装.卸载 在AndroidManifest.xml中注册一个静态广播,监听安装的广播 android.intent.action.PACKAGE_ADDED 监听程序卸载的广播 and ...
- android实践项目一实现简单的验证码和spinner下拉选项效果
android练习demo1 Textview1 类似验证码的效果 点击之后生成一个随机的4位数,更换颜色. 代码如下 public class MainActivity extends Activi ...
- Android实践 -- 对apk进行系统签名
对apk进行系统签名 签名工具 网盘下载 ,需要Android系统的签名的文件 platform.x509.pem 和 platform.pk8 这个两个文件在Android源码中的 ./build/ ...
最新文章
- iOS: NSTimer的循环引用(解决)
- c++语言编辑简单的计算器,c++编写简单的计算器程序
- MFC VC 双缓冲绘图基本原理与实现,详细解释
- Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树
- 将Java EE与jOOQ结合使用的初学者指南
- axure日期选择器组件_vue干货分享,超过六种组件通信方法讲解和精髓归纳
- python3.8.4rc1_Python3.8.4rc1 官方正式版
- linux分区压力测试,stress-Linux系统压力测试工具使用及系统负载很高的几种场景测试...
- 蓝桥杯 基础练习 特殊回文数
- 算到怀疑人生!如何用并查集解决朋友圈个数问题?
- bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)
- 这个被程序员捧上神坛的IDEA插件出来后,我扔掉了Postman了
- dsp 有fft程序吗_Python 中 FFT 快速傅里叶分析
- 亚信科技java笔试题答案_亚信科技java面试题及答案.doc
- 【backtrader源码解析52】indicators部分代码解读(枯燥,仅供参考,源代码解析结束,后面会增加一个backtrader框架分析)
- Devops实现之jenkins (二)
- C++学习笔记(九)——运算符重载
- Cesium之地图清晰度解决方案
- rnqoj-99-配置魔药-dp
- 在大海中与鲨鱼海龟起舞
热门文章
- C# aspx页面动态加载ascx用户控件 及 利用反射调用其内方法
- Task.Factory.StartNew 和 Task.Run 到底有什么区别?
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存...
- 如何在 Dapper.NET 中使用事务?
- 2020 年终总结:变化 积累
- api接口返回动态的json格式?我太难了,尝试一下 linq to json
- 深入剖析.NETCORE中CORS(跨站资源共享)
- .NET 开源项目 StreamJsonRpc 介绍[上篇]
- 研发协同平台数据库死锁处理及改进
- 使用 Azure Function 定时启动云 VM