Xamarin android中使用signalr实现即时通讯

小编 2026-07-02 阅读:1262 评论:0
前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamari...

前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你们,更快地熟悉使用xamarin android进行即时通讯。

先来看一下最终实现的效果:

Xamarin android中使用signalr实现即时通讯

这个简单的例子主要分为两部分:

1.一个Signalr web端提供访问的地址,也就是前面所写的例子 MVC中使用signalR入门教程。发布这个web网页,为Xamarin android的signalr客户端 提供一个url地址连接

2. xamarin android 中引入signalr.client 库,通过连接web地址发送消息,接收消息。

1.发布web网站提供地址

这个web网站我就不再演示了,发布用的还是 MVC中使用signalR入门教程这个例子,集线器类ServerHub 有一个服务器端的方法SendMsg(发送消息)和一个客户端调用的方法showMessage(接收消息)。我稍作了一下修改,会显示是哪个发送消息的设备名称。发布成功后添加的是的路由器的地址,如图:
Xamarin android中使用signalr实现即时通讯

2.新建xamarin android项目引入Signalr.Client 库

引入signalr.client 库非常郁闷,我昨天直接从nuget上引入signalr.client 库的时候,运行项目总是报这个错误,耽误好长时间。估计你们引入的时候也会出现这个错误:


Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'System.Net.Http.Extensions, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Perhaps it doesn't exist in the Mono for Android profile?
文件名:“System.Net.Http.Extensions.dll”
   在 Xamarin.Android.Tuner.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters)

   在 Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(ICollection`1 assemblies, AssemblyDefinition assembly, Boolean topLevel)
   在 Xamarin.Android.Tasks.ResolveAssemblies.Execute()

Xamarin android中使用signalr实现即时通讯

这个错误说明signalr.client 在xamarin android支持的还不够好,今天厂里的牛哥说是nuget上面引入库不兼容,所以只能在xamarin官网上下载后引入。如果你们也是这样的错误,可以下载这个示例xamarin signalr入门例子,引入里面的signalr.client 库。开发xamarin android项目的时候总会碰到很多小错误,虽然不是什么大bug,但是目前圈子很小,百度能解决的不是很多,有基础的话逛逛StackOverflow 还是不错的选择。有些小错误,能真是能让你喝一壶的.....,

引入好signalr.client 之后,新建一个类SignalrChatClient这是这个即时通讯的桥梁,as shown in the figure

Xamarin android中使用signalr实现即时通讯

3.SignalrChatClient负责创建、发送消息、接受消息的方法

SignalrChatClient.cs,代码如下

using System;using System.Threading.Tasks;using Microsoft.AspNet.SignalR.Client;namespace SignalrClientDemo{    public  class SignalrChatClient    {        private readonly HubConnection _connection;        private readonly IHubProxy _proxy;//客户端代理服务器端中心        public event EventHandler<string> OnReceiveEvent; //定义一个接收server端的事件        public SignalrChatClient()        {            _connection = new HubConnection($"http://192.168.16.137:400");            _proxy = _connection.CreateHubProxy("serverHub");        }        //负责连接的方法        public async Task  Connect()        {           await  _connection.Start();            _proxy.On("showMessage", (string  platform,string msg) =>            {                    OnReceiveEvent(this,platform+":" +msg);            });        }        public  Task Send(string message)        {            string serverMethod = "sendMsg"; //serverHub中定义的server端方法名称            if (_connection.State != ConnectionState.Connected)            {                Console.WriteLine("未连接");                return null;            }            Console.WriteLine("已连接");           return   _proxy.Invoke(serverMethod,message);//Invode the 'SendMessage' method on ther server         }    }}

4.最后一步Activity的布局和使用SignalrChatClient

Main.axml布局比较简单,Adapter使用的是ArrayAdapter
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <EditText        android:id="@+id/et_msg"        android:layout_width="match_parent"        android:textColor="#ff0000"        android:layout_height="50dp" />    <Button        android:id="@+id/MyButton"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="@string/Hello" />    <ListView        android:id="@+id/lv_msg"        android:layout_width="match_parent"        android:layout_height="30dp" /></LinearLayout>

MainActivity.cs

using Android.App;using Android.Widget;using Android.OS;namespace SignalrClientDemo{    [Activity(Label = "SignalrClientDemo", MainLauncher = true, Icon = "@drawable/icon")]    public class MainActivity : Activity    {        int count = 1;        protected override async void OnCreate(Bundle bundle)        {            base.OnCreate(bundle);            SetContentView(Resource.Layout.Main);            Button button = FindViewById<Button>(Resource.Id.MyButton);            EditText et_msg = FindViewById<EditText>(Resource.Id.et_msg);            ListView lv_msg = FindViewById<ListView>(Resource.Id.lv_msg);            SignalrChatClient client = new SignalrChatClient();            await client.Connect();            var adapter = new ArrayAdapter(this,Android.Resource.Layout.SimpleListItem1);            string msg = et_msg.Text;            //发送消息            button.Click += delegate {                client.Send(msg);                et_msg.Text = string.Empty;            };            lv_msg.Adapter = adapter;            //使用委托接收消息            client.OnReceiveEvent += (sender, message) => RunOnUiThread(() =>            {                adapter.Add(message);            });        }    }}
实现了这个效果聊天的效果之后,会发现这xamarin android客户端使用signalr实现即时通讯的方式和mvc里的差不多,方式其实是一样的,客户端发送的消息的事件也是要调用服务器端的serverHub类中方法sendMsg,接收消息同样是在委托里定义服务器端中声明的客户端方法showMessage.原理很相似。最近工作之余不是很忙,准备写一个聊天的xamarin android项目出来,希望能快点做出来吧。

例子下载地址:xamarin signalr入门例子

作者:张林

标题:Xamarin android中使用signalr实现即时通讯 原文地址:http://blog.csdn.net/kebi007/article/details/53544379

转载随意注明出处




版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表