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

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

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

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


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

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

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

1.发布web网站提供地址

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

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()

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

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


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

转载随意注明出处




目录
相关文章
|
Android开发
flutter中实现仿Android端的onResume和onPause方法
flutter中实现仿Android端的onResume和onPause方法
|
开发工具 Android开发 iOS开发
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
使用vs2019学习xamarin时,创建新程序。使用模拟器真机等测试都报错如下图错误: ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231030-de8ce5fd.png?x-cos-security-token=r4KyZDEowPT0kGTL0LqE8EnwfN1Nzexadb05dcffed3939ff8d7591c528c01706nvpGSE93QwHpZM8NwhJNTZctNRQa0l3KDhEnqj8P7d8t
127 0
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
|
7月前
|
XML Java 开发工具
优雅草蜻蜓I即时通讯·水银版私有化部署之安卓Android端编译-02
优雅草蜻蜓I即时通讯·水银版私有化部署之安卓Android端编译-02
|
缓存 JSON Java
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
451 1
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
|
存储 Java API
Android即时通讯设计——腾讯IM接入和WebSocket接入
之前项目的群聊是用数据库直接操作的,体验很差,消息很难即时反馈,所以最后考虑到了使用腾讯的IM完成群聊的接入,不过中途还是有点小坎坷的,接入完成之后发现体验版一个群聊只有20人,当时看到体验版支持100个用户也就忍了,现在一个群聊只能20用户,忍不了了,所以暂时找到了**WebSocket**作为临时的解决方案(等有钱了再换),同时支持50个用户在线聊天,也算还行,勉强够用,下面就介绍两种实现方案的接入,正文即将开始~~
518 0
Android即时通讯设计——腾讯IM接入和WebSocket接入
|
Android开发 容器
Android实现面包屑效果,支持Fragment联动
Android实现面包屑效果,支持Fragment联动
|
Android开发
Android实现连线题效果
Android实现连线题效果
|
移动开发 JavaScript Android开发
通过howler.js实现在Android下的微信浏览器自动播放音频
通过howler.js实现在Android下的微信浏览器自动播放音频
560 0
通过howler.js实现在Android下的微信浏览器自动播放音频
|
数据库 Android开发
android 多级下拉菜单实现教程 greendao使用
android 多级下拉菜单实现教程 greendao使用
253 0
android 多级下拉菜单实现教程 greendao使用
|
存储 API Android开发
深入剖析Android四大组件(四)——Messenger实现Android IPC
深入剖析Android四大组件(四)——Messenger实现Android IPC
152 2
下一篇
DataWorks