新文章 网摘 文章 随笔 日记

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

using System;
using System.Windows.Forms;
using BinaryProtocol.Core.Handles;
using BinaryProtocol.Core.Models;
using BinaryProtocol.Core.Tcp;
using BinaryProtocol.Models.Constants;
using BinaryProtocol.Models.Events;
using BinaryProtocol.Server.Handles;
using ProtocolType = BinaryProtocol.Models.Constants.ProtocolType;

namespace BinaryProtocol.Server
{
    public partial class FormServer : Form
    {
        private MessageServer _tcpServer;
        public FormServer()
        {
            InitializeComponent();

           MessageDispatcher.RegisterMessageHandleMapper(
                new MessageHandleMapper(
                    (byte)ProtocolType.Protocol001,
                    (byte)Protocol001MessageType.TemperatureEvent,
                    typeof(TemperatureEventHandle)));

            MessageDispatcher.RegisterMessageHandleMapper(
                new MessageHandleMapper(
                    (byte)ProtocolType.Protocol002,
                    (byte)Protocol001MessageType.TemperatureEvent,
                    typeof(TemperatureEventHandle2)));

            _tcpServer = new MessageServer("127.0.0.1", 51888, AddItemToListBox);
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            _tcpServer.Start();
        }

        private void buttonStop_Click(object sender, EventArgs e)
        {
            _tcpServer.Stop();
        }

        private delegate void AddItemToListBoxDelegate(string str);

        /// <summary>在ListBox中追加状态信息
        /// 
        /// </summary>
        /// <param name="str">要追加的信息</param>
        private void AddItemToListBox(string str)
        {
            if (listBoxStatus.InvokeRequired)
            {
                AddItemToListBoxDelegate d = AddItemToListBox;
                listBoxStatus.Invoke(d, str);
            }
            else
            {
                listBoxStatus.Items.Add(str);
                listBoxStatus.SelectedIndex = listBoxStatus.Items.Count - 1;
                listBoxStatus.ClearSelected();
            }
        }

        private async void BtnSendToDev1_Click(object sender, EventArgs e)
        {
            //创建事件
            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 = 65535
            };

            //编码
            var messageBody1 = new MessageBody<TemperatureEvent>(e1);
            var messageHead1 = new MessageHead(
                2,
                (byte)ProtocolType.Protocol001,
                (byte)Protocol001MessageType.TemperatureEvent,
                3,
                messageBody1.Bytes.Length);


            var message1 = new Message<TemperatureEvent>(messageHead1, messageBody1);

            await _tcpServer.SendAsync("00001", message1);
        }

        private async void BtnSendToDev2_Click(object sender, EventArgs e)
        {
            //创建事件
            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 messageBody2 = new MessageBody<TemperatureEvent>(e2);

            var messageHead2 = new MessageHead(
                3,
                (byte)ProtocolType.Protocol002,
                (byte)Protocol001MessageType.TemperatureEvent,
                5,
                messageBody2.Bytes.Length);

            var message2 = new Message<TemperatureEvent>(messageHead2, messageBody2);

            await _tcpServer.SendAsync("00002", message2);
        }
    }
}
namespace BinaryProtocol.Server
{
    partial class FormServer
    {
        /// <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.groupBox1 = new System.Windows.Forms.GroupBox();
            this.listBoxStatus = new System.Windows.Forms.ListBox();
            this.buttonStop = new System.Windows.Forms.Button();
            this.buttonStart = new System.Windows.Forms.Button();
            this.BtnSendToDev1 = new System.Windows.Forms.Button();
            this.BtnSendToDev2 = new System.Windows.Forms.Button();
            this.groupBox1.SuspendLayout();
            this.SuspendLayout();
            // 
            // groupBox1
            // 
            this.groupBox1.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.groupBox1.Controls.Add(this.listBoxStatus);
            this.groupBox1.Location = new System.Drawing.Point(12, 12);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(735, 167);
            this.groupBox1.TabIndex = 9;
            this.groupBox1.TabStop = false;
            this.groupBox1.Text = "状态信息";
            // 
            // listBoxStatus
            // 
            this.listBoxStatus.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.listBoxStatus.FormattingEnabled = true;
            this.listBoxStatus.ItemHeight = 12;
            this.listBoxStatus.Location = new System.Drawing.Point(19, 20);
            this.listBoxStatus.Name = "listBoxStatus";
            this.listBoxStatus.Size = new System.Drawing.Size(701, 136);
            this.listBoxStatus.TabIndex = 0;
            // 
            // buttonStop
            // 
            this.buttonStop.Location = new System.Drawing.Point(125, 197);
            this.buttonStop.Name = "buttonStop";
            this.buttonStop.Size = new System.Drawing.Size(75, 23);
            this.buttonStop.TabIndex = 8;
            this.buttonStop.Text = "停止监听";
            this.buttonStop.UseVisualStyleBackColor = true;
            this.buttonStop.Click += new System.EventHandler(this.buttonStop_Click);
            // 
            // buttonStart
            // 
            this.buttonStart.Location = new System.Drawing.Point(31, 197);
            this.buttonStart.Name = "buttonStart";
            this.buttonStart.Size = new System.Drawing.Size(75, 23);
            this.buttonStart.TabIndex = 7;
            this.buttonStart.Text = "开始监听";
            this.buttonStart.UseVisualStyleBackColor = true;
            this.buttonStart.Click += new System.EventHandler(this.buttonStart_Click);
            // 
            // BtnSendToDev1
            // 
            this.BtnSendToDev1.Location = new System.Drawing.Point(291, 197);
            this.BtnSendToDev1.Name = "BtnSendToDev1";
            this.BtnSendToDev1.Size = new System.Drawing.Size(94, 23);
            this.BtnSendToDev1.TabIndex = 10;
            this.BtnSendToDev1.Text = "给设备1发信息";
            this.BtnSendToDev1.UseVisualStyleBackColor = true;
            this.BtnSendToDev1.Click += new System.EventHandler(this.BtnSendToDev1_Click);
            // 
            // BtnSendToDev2
            // 
            this.BtnSendToDev2.Location = new System.Drawing.Point(417, 197);
            this.BtnSendToDev2.Name = "BtnSendToDev2";
            this.BtnSendToDev2.Size = new System.Drawing.Size(98, 23);
            this.BtnSendToDev2.TabIndex = 11;
            this.BtnSendToDev2.Text = "给设备2发信息";
            this.BtnSendToDev2.UseVisualStyleBackColor = true;
            this.BtnSendToDev2.Click += new System.EventHandler(this.BtnSendToDev2_Click);
            // 
            // FormServer
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(760, 239);
            this.Controls.Add(this.BtnSendToDev2);
            this.Controls.Add(this.BtnSendToDev1);
            this.Controls.Add(this.groupBox1);
            this.Controls.Add(this.buttonStop);
            this.Controls.Add(this.buttonStart);
            this.Name = "FormServer";
            this.Text = "异步TCP聊天服务器端";
            this.groupBox1.ResumeLayout(false);
            this.ResumeLayout(false);

        }
        #endregion
        private System.Windows.Forms.GroupBox groupBox1;
        private System.Windows.Forms.ListBox listBoxStatus;
        private System.Windows.Forms.Button buttonStop;
        private System.Windows.Forms.Button buttonStart;
        private System.Windows.Forms.Button BtnSendToDev1;
        private System.Windows.Forms.Button BtnSendToDev2;
    }
}
using System.Threading.Tasks;
using BinaryProtocol.Core.Handles;
using BinaryProtocol.Core.Tcp;
using BinaryProtocol.Models.Events;

namespace BinaryProtocol.Server.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.Server.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)}");
            });
        }
    }
}

 

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