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