1、新建WinForm窗体应用程序, .Net Framework 平台

2、Nuget包安装
Microsoft.AspNetCore.SignalR.Client
3、修改Form1.Designer.cs 文件
partial class Form1
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.addressTextBox = new System.Windows.Forms.TextBox();
this.connectButton = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.messagesList = new System.Windows.Forms.ListBox();
this.sendButton = new System.Windows.Forms.Button();
this.messageTextBox = new System.Windows.Forms.TextBox();
this.disconnectButton = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// addressTextBox
//
this.addressTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.addressTextBox.Location = new System.Drawing.Point(66, 10);
this.addressTextBox.Name = "addressTextBox";
this.addressTextBox.Size = new System.Drawing.Size(521, 20);
this.addressTextBox.TabIndex = 0;
this.addressTextBox.Enter += new System.EventHandler(this.addressTextBox_Enter);
//
// connectButton
//
this.connectButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.connectButton.Location = new System.Drawing.Point(593, 8);
this.connectButton.Name = "connectButton";
this.connectButton.Size = new System.Drawing.Size(75, 23);
this.connectButton.TabIndex = 1;
this.connectButton.Text = "Connect";
this.connectButton.UseVisualStyleBackColor = true;
this.connectButton.Click += new System.EventHandler(this.connectButton_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 13);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(48, 13);
this.label1.TabIndex = 2;
this.label1.Text = "Address:";
//
// messagesList
//
this.messagesList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.messagesList.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.messagesList.FormattingEnabled = true;
this.messagesList.Location = new System.Drawing.Point(15, 36);
this.messagesList.Name = "messagesList";
this.messagesList.SelectionMode = System.Windows.Forms.SelectionMode.None;
this.messagesList.Size = new System.Drawing.Size(734, 485);
this.messagesList.TabIndex = 3;
this.messagesList.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.messagesList_DrawItem);
//
// sendButton
//
this.sendButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.sendButton.Enabled = false;
this.sendButton.Location = new System.Drawing.Point(674, 532);
this.sendButton.Name = "sendButton";
this.sendButton.Size = new System.Drawing.Size(75, 23);
this.sendButton.TabIndex = 5;
this.sendButton.Text = "Send";
this.sendButton.UseVisualStyleBackColor = true;
this.sendButton.Click += new System.EventHandler(this.sendButton_Click);
//
// messageTextBox
//
this.messageTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.messageTextBox.Enabled = false;
this.messageTextBox.Location = new System.Drawing.Point(15, 534);
this.messageTextBox.Name = "messageTextBox";
this.messageTextBox.Size = new System.Drawing.Size(653, 20);
this.messageTextBox.TabIndex = 4;
this.messageTextBox.Enter += new System.EventHandler(this.messageTextBox_Enter);
//
// disconnectButton
//
this.disconnectButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.disconnectButton.Enabled = false;
this.disconnectButton.Location = new System.Drawing.Point(674, 8);
this.disconnectButton.Name = "disconnectButton";
this.disconnectButton.Size = new System.Drawing.Size(75, 23);
this.disconnectButton.TabIndex = 6;
this.disconnectButton.Text = "Disconnect";
this.disconnectButton.UseVisualStyleBackColor = true;
this.disconnectButton.Click += new System.EventHandler(this.disconnectButton_Click);
//
// ChatForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(761, 566);
this.Controls.Add(this.disconnectButton);
this.Controls.Add(this.sendButton);
this.Controls.Add(this.messageTextBox);
this.Controls.Add(this.messagesList);
this.Controls.Add(this.label1);
this.Controls.Add(this.connectButton);
this.Controls.Add(this.addressTextBox);
this.Name = "ChatForm";
this.Text = "SignalR Chat Sample";
this.Load += new System.EventHandler(this.ChatForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.TextBox addressTextBox;
private System.Windows.Forms.Button connectButton;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ListBox messagesList;
private System.Windows.Forms.Button sendButton;
private System.Windows.Forms.TextBox messageTextBox;
private System.Windows.Forms.Button disconnectButton;
#endregion
}
4、修改Form1.cs文件
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private HubConnection _connection;
private void ChatForm_Load(object sender, EventArgs e)
{
addressTextBox.Focus();
}
private void addressTextBox_Enter(object sender, EventArgs e)
{
AcceptButton = connectButton;
}
private async void connectButton_Click(object sender, EventArgs e)
{
UpdateState(connected: false);
_connection = new HubConnectionBuilder()
.WithUrl(addressTextBox.Text)
.Build();
_connection.On<string, string>("myMessage", (s1, s2) => OnSend(s1, s2));
Log(Color.Gray, "Starting connection...");
try
{
await _connection.StartAsync();
}
catch (Exception ex)
{
Log(Color.Red, ex.ToString());
return;
}
Log(Color.Gray, "Connection established.");
UpdateState(connected: true);
messageTextBox.Focus();
}
private async void disconnectButton_Click(object sender, EventArgs e)
{
Log(Color.Gray, "Stopping connection...");
try
{
await _connection.StopAsync();
}
catch (Exception ex)
{
Log(Color.Red, ex.ToString());
}
Log(Color.Gray, "Connection terminated.");
UpdateState(connected: false);
}
private void messageTextBox_Enter(object sender, EventArgs e)
{
AcceptButton = sendButton;
}
private async void sendButton_Click(object sender, EventArgs e)
{
try
{
await _connection.InvokeAsync("Send", "WinFormsApp", messageTextBox.Text);
}
catch (Exception ex)
{
Log(Color.Red, ex.ToString());
}
}
private void UpdateState(bool connected)
{
disconnectButton.Enabled = connected;
connectButton.Enabled = !connected;
addressTextBox.Enabled = !connected;
messageTextBox.Enabled = connected;
sendButton.Enabled = connected;
}
private void OnSend(string name, string message)
{
Log(Color.Black, name + ": " + message);
}
private void Log(Color color, string message)
{
Action callback = () =>
{
messagesList.Items.Add(new LogMessage(color, message));
};
Invoke(callback);
}
private class LogMessage
{
public Color MessageColor { get; }
public string Content { get; }
public LogMessage(Color messageColor, string content)
{
MessageColor = messageColor;
Content = content;
}
}
private void messagesList_DrawItem(object sender, DrawItemEventArgs e)
{
var message = (LogMessage)messagesList.Items[e.Index];
e.Graphics.DrawString(
message.Content,
messagesList.Font,
new SolidBrush(message.MessageColor),
e.Bounds);
}
}
5、启动上一篇的SignalR服务端
输入地址 http://127.0.0.1:5000/myTestHub
