編輯:關於android開發
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 和一個 發送按鈕,最終界面如下:

主窗體的 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 類型的參數,一個是發送消息的用戶名,一個是消息內容。
閱讀全文
懸浮對話框的實現,懸浮對話框實現
懸浮對話框的實現,懸浮對話框實現直接上代碼: private void setDialog(){ View view = getLayoutIn
Android學習指南之三十五:App Widget開發入門指導
本節所要講的主要內容包括Android桌面小部件、App Widget的開發入
使用ViewPager切換Fragment時,防止頻繁調用OnCreatView,fragmentoncreat
使用ViewPager切換Fragment時,防止頻繁調用OnCreatView,fragmentoncreat使用ViewPager切換Fragment,我原先使用系統
Android Fragment 剖析,androidfragment
Android Fragment 剖析,androidfragment1.Fragment如何產生?2.什麼是FragmentAndroid運行在各種各樣的設備中,有小屏