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

    阅读全文

  • 相关阅读:
    要对一个任意进程(包括系统安全进程和服务进程)进行指定了相关的访问权 [OpenProcessToken,LookupPrivilegeValue,AdjustTokenPrivileges]
    XPath 表达式的上下文
    Visual C++ ADO数据库编程入门
    sscanf 详细说明
    asp.net 文件下载
    [转]JavaScript 获得页面区域大小的代码
    IE与Firefox等浏览器对容器width的不同解释及解决办法
    编译Boost_1_37_0 For VS2008
    asp.net cookies
    [转]C++字符串格式化 sprintf
  • 原文地址:https://www.cnblogs.com/forgetu/p/6246863.html
Copyright © 2020-2023  润新知