Xin chào các bạn, bài viết hôm nay mình sẽ chia sẽ đến các bạn source code Chat Client, sử dụng công nghệ Signalr trong lập trình C#.
Signalr là gì?
ASP.NET SignalR là một thư viện cho các lập trình viên Asp.Net đơn giản hóa quá trình thêm chức năng web real-time trong phát triển ứng dụng. Real-time web functionality là gì ? Đó là khả năng server đẩy những nội dung tới client đã được kết nối một cách tức thì. Nó khác với giao thức HTTP thông thường: server đợi những yêu cầu từ client và trả về nội dung tương ứng.
SignalR có thể sử dụng trong bất kì chức năng web real-time nào. Trong đó ứng dụng chat trên web là một ví dụ điển hình. Ngoài ra, các ứng dụng cho dashboards, monitoring, collaborative là những gợi ý cho việc sử dụng SignalR.
SignalR phân phối một API đơn thuần cho việc tạo server-to-client remote procedure call ( RPC ) để gọi những hàm javascript trong trình duyệt ( và những nền tảng khác ) từ code. Net của server-side. SignalR cũng gồm có API cho việc quản trị liên kết ( connect và disconnect events ) và những liên kết nhóm .
Video demo ứng dụng chat sử dụng SignalR:
Đầu tiên, để chạy những bạn cần thiết lập cho mình thư viện SignaIR từ Nuget :
PM> Install-Package Microsoft.AspNet.SignalR -Version 2.4.0
Source code cho Form Server C # :
using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Microsoft.Owin.Hosting;
using Owin;
using System;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SignalRChat
{
public partial class WinFormsServer : Form
{
private IDisposable SignalR { get; set; }
const string ServerURI = "http://localhost:8080";
internal WinFormsServer()
{
InitializeComponent();
}
private void ButtonStart_Click(object sender, EventArgs e)
{
WriteToConsole("Starting server...");
ButtonStart.Enabled = false;
Task.Run(() => StartServer());
}
private void ButtonStop_Click(object sender, EventArgs e)
{
//SignalR will be disposed in the FormClosing event
Close();
}
private void StartServer()
{
try
{
SignalR = WebApp.Start(ServerURI);
}
catch (TargetInvocationException)
{
WriteToConsole("Server failed to start. A server is already running on " + ServerURI);
this.Invoke((Action)(() => ButtonStart.Enabled = true));
return;
}
this.Invoke((Action)(() => ButtonStop.Enabled = true));
WriteToConsole("Server started at " + ServerURI);
}
internal void WriteToConsole(String message)
{
if (RichTextBoxConsole.InvokeRequired)
{
this.Invoke((Action)(() =>
WriteToConsole(message)
));
return;
}
RichTextBoxConsole.AppendText(message + Environment.NewLine);
}
private void WinFormsServer_FormClosing(object sender, FormClosingEventArgs e)
{
if (SignalR != null)
{
SignalR.Dispose();
}
}
}
class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
public class MyHub : Hub
{
public void Send(string name, string message)
{
Clients.All.addMessage(name, message);
}
public override Task OnConnected()
{
Program.MainForm.WriteToConsole("Client connected: " + Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected()
{
Program.MainForm.WriteToConsole("Client disconnected: " + Context.ConnectionId);
return base.OnDisconnected();
}
}
}
Source code Form Client C # :
using Microsoft.AspNet.SignalR.Client;
using System;
using System.Net.Http;
using System.Windows.Forms;
namespace WinFormsClient
{
public partial class WinFormsClient : Form
{
private String UserName { get; set; }
private IHubProxy HubProxy { get; set; }
const string ServerURI = "http://localhost:8080/signalr";
private HubConnection Connection { get; set; }
internal WinFormsClient()
{
InitializeComponent();
}
private void ButtonSend_Click(object sender, EventArgs e)
{
HubProxy.Invoke("Send", UserName, TextBoxMessage.Text);
TextBoxMessage.Text = String.Empty;
TextBoxMessage.Focus();
}
private async void ConnectAsync()
{
Connection = new HubConnection(ServerURI);
Connection.Closed += Connection_Closed;
HubProxy = Connection.CreateHubProxy("MyHub");
HubProxy.On("AddMessage", (name, message) =>
this.Invoke((Action)(() =>
RichTextBoxConsole.AppendText(String.Format("{0}: {1}" + Environment.NewLine, name, message))
))
);
try
{
await Connection.Start();
}
catch (HttpRequestException)
{
StatusText.Text = "Unable to connect to server: Start server before connecting clients.";
return;
}
//Activate UI
SignInPanel.Visible = false;
ChatPanel.Visible = true;
ButtonSend.Enabled = true;
TextBoxMessage.Focus();
RichTextBoxConsole.AppendText("Connected to server at " + ServerURI + Environment.NewLine);
}
private void Connection_Closed()
{
//Deactivate chat UI; show login UI.
this.Invoke((Action)(() => ChatPanel.Visible = false));
this.Invoke((Action)(() => ButtonSend.Enabled = false));
this.Invoke((Action)(() => StatusText.Text = "You have been disconnected."));
this.Invoke((Action)(() => SignInPanel.Visible = true));
}
private void SignInButton_Click(object sender, EventArgs e)
{
UserName = UserNameTextBox.Text;
if (!String.IsNullOrEmpty(UserName))
{
StatusText.Visible = true;
StatusText.Text = "Connecting to server...";
ConnectAsync();
}
}
private void WinFormsClient_FormClosing(object sender, FormClosingEventArgs e)
{
if (Connection != null)
{
Connection.Stop();
Connection.Dispose();
}
}
}
}
,>
Have fun 🙂
DOWNLOAD SOURCE