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实践相关推荐

  1. android静默卸载,Android实践 -- Android静默安装和卸载

    App的静默安装和卸载 Android系统本身提供了安装卸载功能,但是api接口是@hide的,不是公开的接口,所以在应用级别 是无法实现静默安装和卸载的,要实现静默安装和卸载需要是系统应用,要有系统 ...

  2. Android 系统(194)---Android实践 -- 设置系统日期时间和时区

    Android实践 -- 设置系统日期时间和时区 转自:https://www.cnblogs.com/Free-Thinker/p/6627813.html 设置系统日期时间和时区 设置系统的日期时 ...

  3. Android 实践:做一款可用的天气 APP

    可能很多人会问:之前已经写过一篇博文来介绍怎么做一款简单的新闻APP(http://blog.csdn.net/yiwei12/article/details/71249628),为什么还要专门一篇来 ...

  4. Android实践--模拟器的加度的快感

    Android---如何提高模拟器的速度 做Android开发的程序猿们,很多人心中有一纠结:"Android模拟器怎么这么慢啊,用自己的爱机测试有点小小不舍",谷歌推出的adt- ...

  5. React Native for Android 实践 — 实现知乎日报客户端

    React Native for Android 的发布,对一个 Android 开发者来说还是有相当的吸引力的.通过前面这篇博客:React Native for Android 入门老虎好不容易入 ...

  6. Android实践--如何提高Android模拟器的运行速度

    Android---如何提高模拟器的速度 做Android开发的程序猿们,很多人心中有一纠结:"Android模拟器怎么这么慢啊,用自己的爱机测试有点小小不舍",谷歌推出的adt- ...

  7. Android实践 -- 监听应用程序的安装、卸载

    监听应用程序的安装.卸载 在AndroidManifest.xml中注册一个静态广播,监听安装的广播 android.intent.action.PACKAGE_ADDED 监听程序卸载的广播 and ...

  8. android实践项目一实现简单的验证码和spinner下拉选项效果

    android练习demo1 Textview1 类似验证码的效果 点击之后生成一个随机的4位数,更换颜色. 代码如下 public class MainActivity extends Activi ...

  9. Android实践 -- 对apk进行系统签名

    对apk进行系统签名 签名工具 网盘下载 ,需要Android系统的签名的文件 platform.x509.pem 和 platform.pk8 这个两个文件在Android源码中的 ./build/ ...

最新文章

  1. iOS: NSTimer的循环引用(解决)
  2. c++语言编辑简单的计算器,c++编写简单的计算器程序
  3. MFC VC 双缓冲绘图基本原理与实现,详细解释
  4. Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树
  5. 将Java EE与jOOQ结合使用的初学者指南
  6. axure日期选择器组件_vue干货分享,超过六种组件通信方法讲解和精髓归纳
  7. python3.8.4rc1_Python3.8.4rc1 官方正式版
  8. linux分区压力测试,stress-Linux系统压力测试工具使用及系统负载很高的几种场景测试...
  9. 蓝桥杯 基础练习 特殊回文数
  10. 算到怀疑人生!如何用并查集解决朋友圈个数问题?
  11. bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)
  12. 这个被程序员捧上神坛的IDEA插件出来后,我扔掉了Postman了
  13. dsp 有fft程序吗_Python 中 FFT 快速傅里叶分析
  14. 亚信科技java笔试题答案_亚信科技java面试题及答案.doc
  15. 【backtrader源码解析52】indicators部分代码解读(枯燥,仅供参考,源代码解析结束,后面会增加一个backtrader框架分析)
  16. Devops实现之jenkins (二)
  17. C++学习笔记(九)——运算符重载
  18. Cesium之地图清晰度解决方案
  19. rnqoj-99-配置魔药-dp
  20. 在大海中与鲨鱼海龟起舞

热门文章

  1. C# aspx页面动态加载ascx用户控件 及 利用反射调用其内方法
  2. Task.Factory.StartNew 和 Task.Run 到底有什么区别?
  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存...
  4. 如何在 Dapper.NET 中使用事务?
  5. 2020 年终总结:变化 积累
  6. api接口返回动态的json格式?我太难了,尝试一下 linq to json
  7. 深入剖析.NETCORE中CORS(跨站资源共享)
  8. .NET 开源项目 StreamJsonRpc 介绍[上篇]
  9. 研发协同平台数据库死锁处理及改进
  10. 使用 Azure Function 定时启动云 VM