using System;
using System.Windows.Forms;
using BinaryProtocol.Core.Handles;
using BinaryProtocol.Core.Models;
using BinaryProtocol.Core.Tcp;
using BinaryProtocol.Handles;
using BinaryProtocol.Models.Constants;
using BinaryProtocol.Models.Events;
using ProtocolType = BinaryProtocol.Models.Constants.ProtocolType;
namespace BinaryProtocol
{
public partial class FormClient : Form
{
private MessageClient _messageClient1;
private MessageClient _messageClient2;
public FormClient()
{
InitializeComponent();
RegisterMessageHandleMapper();
}
private void RegisterMessageHandleMapper()
{
//注册消息处理器映射器
MessageDispatcher.RegisterMessageHandleMapper(
new MessageHandleMapper(
(byte)Models.Constants.ProtocolType.Protocol001,
(byte)Protocol001MessageType.TemperatureEvent,
typeof(TemperatureEventHandle)));
MessageDispatcher.RegisterMessageHandleMapper(
new MessageHandleMapper(
(byte)ProtocolType.Protocol002,
(byte)Protocol001MessageType.TemperatureEvent,
typeof(TemperatureEventHandle2)));
}
private void Connect()
{
_messageClient1 = new MessageClient("00001", "127.0.0.1", 51888, AddStatus);
_messageClient2 = new MessageClient("00002", "127.0.0.1", 51888, AddStatus);
}
/// <summary>在ListBox中追加状态信息
///
/// </summary>
/// <param name="message">要追加的信息</param>
private delegate void AddStatusDelegate(string message);
/// <summary>向richTextBoxStatus中添加状态信息</summary>
private void AddStatus(string message)
{
if (richTextBoxStatus.InvokeRequired)
{
AddStatusDelegate d = AddStatus;
richTextBoxStatus.Invoke(d, message);
}
else
{
richTextBoxStatus.AppendText($"{message}\r\n");
}
}
private async void BtnSend_Click(object sender, System.EventArgs e)
{
if (_messageClient1==null)
{
AddStatus($"_messageClient1尚未连接到服务器");
return;
}
if (_messageClient2 == null)
{
AddStatus($"_messageClient2尚未连接到服务器");
return;
}
//创建事件
TemperatureEvent e1 = new TemperatureEvent
{
DeviceId = "Dev00001",
Temperature = 23,
Time = DateTime.Now,
Note = "备注",
Field5 = 5,
Field6 = 6,
Field7 = 7.4321f,
Field8 = 8.12345d,
Field11 = '/',
Field12 = 15665565,
Field13 = 127,
Field14 = 4294967295,
Field15 = 18446744073709551615,
Field16 = 12345
};
TemperatureEvent e2 = new TemperatureEvent
{
DeviceId = "Dev00002",
Temperature = 29,
Time = DateTime.Now,
Note = "备注2",
Field5 = 4,
Field6 = 3,
Field7 = 5.89221f,
Field8 = 6.1885d,
Field11 = '`',
Field12 = 46335,
Field13 = 89,
Field14 = 4332468,
Field15 = 1789654853,
Field16 = 32456
};
//编码
var messageBody1 = new MessageBody<TemperatureEvent>(e1);
var messageBody2 = new MessageBody<TemperatureEvent>(e2);
var messageHead1 = new MessageHead(
2,
(byte)ProtocolType.Protocol001,
(byte)Protocol001MessageType.TemperatureEvent,
3,
messageBody1.Bytes.Length);
var messageHead2 = new MessageHead(
3,
(byte)ProtocolType.Protocol002,
(byte)Protocol001MessageType.TemperatureEvent,
5,
messageBody2.Bytes.Length);
var message1 = new Message<TemperatureEvent>(messageHead1, messageBody1);
var message2 = new Message<TemperatureEvent>(messageHead2, messageBody2);
await _messageClient1.SendAsync("00001", message1);
await _messageClient2.SendAsync("00002", message2);
}
private void buttonConnect_Click(object sender, System.EventArgs e)
{
Connect();
}
}
}
namespace BinaryProtocol
{
partial class FormClient
{
/// <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.buttonConnect = new System.Windows.Forms.Button();
this.richTextBoxStatus = new System.Windows.Forms.RichTextBox();
this.BtnSend = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// buttonConnect
//
this.buttonConnect.Location = new System.Drawing.Point(19, 12);
this.buttonConnect.Name = "buttonConnect";
this.buttonConnect.Size = new System.Drawing.Size(102, 23);
this.buttonConnect.TabIndex = 15;
this.buttonConnect.Text = "连接";
this.buttonConnect.UseVisualStyleBackColor = true;
this.buttonConnect.Click += new System.EventHandler(this.buttonConnect_Click);
//
// richTextBoxStatus
//
this.richTextBoxStatus.Location = new System.Drawing.Point(12, 78);
this.richTextBoxStatus.Name = "richTextBoxStatus";
this.richTextBoxStatus.Size = new System.Drawing.Size(632, 343);
this.richTextBoxStatus.TabIndex = 21;
this.richTextBoxStatus.Text = "";
//
// BtnSend
//
this.BtnSend.Location = new System.Drawing.Point(178, 11);
this.BtnSend.Name = "BtnSend";
this.BtnSend.Size = new System.Drawing.Size(75, 23);
this.BtnSend.TabIndex = 22;
this.BtnSend.Text = "发送";
this.BtnSend.UseVisualStyleBackColor = true;
this.BtnSend.Click += new System.EventHandler(this.BtnSend_Click);
//
// FormClient
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(658, 433);
this.Controls.Add(this.BtnSend);
this.Controls.Add(this.richTextBoxStatus);
this.Controls.Add(this.buttonConnect);
this.Name = "FormClient";
this.Text = "异步Tcp聊天客户端";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button buttonConnect;
private System.Windows.Forms.RichTextBox richTextBoxStatus;
private System.Windows.Forms.Button BtnSend;
}
}
using System.Threading.Tasks;
using BinaryProtocol.Core.Handles;
using BinaryProtocol.Core.Tcp;
using BinaryProtocol.Models.Events;
namespace BinaryProtocol.Handles
{
/// <summary>
/// 事件处理器
/// </summary>
public class TemperatureEventHandle : MessageHandle<TemperatureEvent>
{
public override async Task ConsumeAsync(ConnectContext connectContext)
{
await Task.Run(() =>
{
connectContext.LogAction($"收到消息:{Newtonsoft.Json.JsonConvert.SerializeObject(MessageBody.Value)}");
});
}
}
}
using System.Threading.Tasks;
using BinaryProtocol.Core.Handles;
using BinaryProtocol.Core.Tcp;
using BinaryProtocol.Models.Events;
namespace BinaryProtocol.Handles
{
/// <summary>
/// 事件处理器
/// </summary>
public class TemperatureEventHandle2 : MessageHandle<TemperatureEvent>
{
public override async Task ConsumeAsync(ConnectContext connectContext)
{
await Task.Run(() =>
{
connectContext.LogAction($"收到消息:{Newtonsoft.Json.JsonConvert.SerializeObject(MessageBody.Value)}");
});
}
}
}
说明:
协议类型0和消息类型0为系统保留类型,用户定义的协议不得使用,否则会造成不匹配的消息解释错误。
用户自定义协议类型和消息类型应从1开始。