新文章 网摘 文章 随笔 日记

自己写的TCP自定义二进制协议(七)

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开始。

 

posted @ 2020-10-27 17:09  岭南春  阅读(175)  评论(0)    收藏  举报