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 + "\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");
                });
            }
        }
    }

以上代碼包含啟動服務,向所有客戶端發送消息,記錄消息幾個方法,代碼非常簡單,這里就不做過多的解釋了。

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 類型的參數,一個是發送消息的用戶名,一個是消息內容。

閱讀全文

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM