zoukankan      html  css  js  c++  java
  • XAMARIN.ANDROID SIGNALR 实时消息接收发送示例

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

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

    服务端:

    1、新建一个 WPF 应用,通过 Nuget 添加引用 SignalR.SelfHost 类库

    Install-Package Microsoft.AspNet.SignalR.SelfHost

    如果要支持跨域访问,还需要引用 Microsoft.Owin.Cors 类库

    Install-Package Microsoft.Owin.Cors

    2、做一个简单的界面,显示接收和发送的消息,在 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 和一个 发送按钮,最终界面如下:

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

    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 + "
    ");
                    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 + "
    ");
     
                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 + "
    ");
                }
                else
                {
                    Dispatcher.Invoke(() =>
                    {
                        UxInfo.AppendText(message + "
    ");
                    });
                }
            }
        }

    以上代码包含启动服务,向所有客户端发送消息,记录消息几个方法,代码非常简单,这里就不做过多的解释了。

    3、添加一个 Startup 类,代码如下:

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

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

    4、新建一个 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 类型的参数,一个是发送消息的用户名,一个是消息内容。

    阅读全文

  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/forgetu/p/6246863.html
Copyright © 2011-2022 走看看