XAMARIN.ANDROID SIGNALR 实时消息接收发送示例

SignalR 是一个开发实时 Web 应用的 .NET 类库,使用 SignalR 能够很容易的构建基于 ASP.NET 的实时 Web 应用。SignalR 支持多种服务器和客户端,能够 Host 在 7.0  以上的 IIS 服务器,或者经过 Owin Host 在桌面应用和 Windows 服务的进程中;支持的客户端有浏览器、桌面应用、Siliverlight、各类手机等。css

本文将会带你作一个 WPF 应用 Host 的 SignalR 服务端,和一个 Xamarin.Android 的客户端,实现服务端和客户端的简单的消息接收发送。android

服务端:sql

一、新建一个 WPF 应用,经过 Nuget 添加引用 SignalR.SelfHost 类库跨域

Install-Package Microsoft.AspNet.SignalR.SelfHost

若是要支持跨域访问,还须要引用 Microsoft.Owin.Cors 类库浏览器

Install-Package Microsoft.Owin.Cors

二、作一个简单的界面,显示接收和发送的消息,在 MainWindow.xaml 中添加下面的代码:服务器

<Grid>         <Grid.RowDefinitions>             <RowDefinition Height="Auto"/>             <RowDefinition/>             <RowDefinition Height="Auto"/>         </Grid.RowDefinitions>         <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="10">             <Button Name="UxStart" Click="UxStart_Click" Width="80" Height="30" Content="启动" Margin="20,0"/>             <Button Name="UxStop" Click="UxStop_Click" Width="80" Height="30" Content="中止"/>         </StackPanel>         <RichTextBox Name="UxInfo" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="10,0" IsReadOnly="True"/>         <StackPanel Grid.Row="2" Orientation="Horizontal" Margin="10">             <TextBox Name="UxMessage" HorizontalAlignment="Stretch" Width="400" Height="30"/>             <Button Name="UxSend" Click="UxSend_Click" Width="80" Height="30" HorizontalAlignment="Right" Content="发送"/>         </StackPanel>     </Grid>

以上代码添加了一个启动按钮和一个中止按钮,用来启动和中止 SignalR 服务端,接着添加一个 RichTextBox 用来显示发送和收到的信息,而后是一个用来输入要发送的信息的 TextBox 和一个 发送按钮,最终界面以下:app

chat-server-window
主窗体的 C# 代码:ui

public partial class MainWindow : Window
    {
        private IDisposable _signalrServer;
        private string _serverUrl = "http://192.168.0.102:8080";
 
        public MainWindow()
        {
            InitializeComponent();
 
            UxStop.IsEnabled = false;
        }
                
        private void UxStart_Click(object sender, RoutedEventArgs e)
        {
            StartServer();
 
            UxStart.IsEnabled = false;
        }
 
        private void StartServer()
        {
            try
            {
                _signalrServer = WebApp.Start(_serverUrl);
 
                LogMessage("服务已启动:" + _serverUrl + "\r");
                UxStop.IsEnabled = true;
            }
            catch (TargetInvocationException ex)
            {
                LogMessage(ex.Message);
            }
        }
 
        private void UxStop_Click(object sender, RoutedEventArgs e)
        {
            _signalrServer.Dispose();
            Close();
        }
 
        private void UxSend_Click(object sender, RoutedEventArgs e)
        {
            LogMessage("Server: " + UxMessage.Text + "\r");
 
            var context = GlobalHost.ConnectionManager.GetHubContext<HubDemo>();
            context.Clients.All.send("Server: ", UxMessage.Text);
 
            UxMessage.Text = "";
        }
 
        public void LogMessage(string message)
        {
            if (UxInfo.CheckAccess())
            {
                UxInfo.AppendText(message + "\r");
            }
            else
            {
                Dispatcher.Invoke(() =>
                {
                    UxInfo.AppendText(message + "\r");
                });
            }
        }
    }

以上代码包含启动服务,向全部客户端发送消息,记录消息几个方法,代码很是简单,这里就不作过多的解释了。spa

三、添加一个 Startup 类,代码以下:.net

internal class Startup     {         public void Configuration(IAppBuilder app)         {             app.UseCors(CorsOptions.AllowAll);             app.MapSignalR();         }     }

如今这里只有两句代码,第一句启用跨域支持,第二句映射 SignalR 的地址。

四、新建一个 Hub,这里命名为 HubDemo,继承 SignalR.Hub,代码以下:

public class HubDemo : Hub { public void Send(string name, string message) { _repository.Log(name, message); Clients.All.Send(name, message); } }

这里只有一个 Send 方法,发送用户名和信息。

接着定义一个记录接收和发送的消息的接口:

public interface IMessageRepository { void Log(string name, string message); }

接口中只定义了一个 Log 方法,带有两个 string 类型的参数,一个是发送消息的用户名,一个是消息内容。

阅读全文

相关文章
相关标签/搜索