IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> c# TCP通信编程 -> 正文阅读

[网络协议]c# TCP通信编程

协议类

   public abstract class Protocol<TMessageType>
    {
        const int HEADER_SIZE = 4;

        public async Task<TMessageType> ReceiveAsync(NetworkStream networkStream)
        {
            var bodyLength = await ReadHeader(networkStream);
            AssertValidMessageLength(bodyLength);
            return await ReadBody(networkStream, bodyLength);
        }

        public async Task SendAsync<T>(NetworkStream networkStream, T message)
        {
            var (header, body) = Encode(message);
            await networkStream.WriteAsync(header, 0, header.Length);
            await networkStream.WriteAsync(body, 0, body.Length);
        }

        async Task<int> ReadHeader(NetworkStream networkStream)
        {
            var headerBytes = await ReadAsync(networkStream, HEADER_SIZE);
            return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(headerBytes, 0));
        }

        async Task<TMessageType> ReadBody(NetworkStream networkStream, int bodyLength)
        {
            var bodyBytes = await ReadAsync(networkStream, bodyLength);
            return Decode(bodyBytes);
        }

        async Task<byte[]> ReadAsync(NetworkStream networkStream, int bytesToRead)
        {
            var buffer = new byte[bytesToRead];
            int bytesRead = 0;
            while (bytesRead < bytesToRead)
            {
                var newBytes = await networkStream.ReadAsync(buffer, bytesRead, buffer.Length);
                if (newBytes == 0)
                {
                    throw new Exception("Socket Closed");
                }
                bytesRead += newBytes;
            }
            return buffer;
        }

        protected (byte[] header, byte[] body) Encode<T>(T message)
        {
            var bodyBytes = EncodeBody(message);
            var headerBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bodyBytes.Length));
            return (headerBytes, bodyBytes);
        }

        protected abstract TMessageType Decode(byte[] message);

        protected abstract byte[] EncodeBody<T>(T messageType);

        protected virtual void AssertValidMessageLength(int messageLength)
        {
            if (messageLength < 1)
            {
                throw new Exception("Invalid Length");
            }
        }
    }

JSON协议类

   public class JsonMessageProtocal : Protocol<JObject>
    {
        static readonly JsonSerializer _serializer;
        static readonly JsonSerializerSettings _settings;

        static JsonMessageProtocal()
        {
            _settings = new JsonSerializerSettings
            {
                Formatting = Formatting.Indented,
                DateTimeZoneHandling = DateTimeZoneHandling.Utc,
                ContractResolver = new DefaultContractResolver
                {
                    NamingStrategy = new CamelCaseNamingStrategy
                    {
                        ProcessDictionaryKeys = false
                    }
                }
            };
            _serializer = JsonSerializer.Create(_settings);
        }

        protected override JObject Decode(byte[] message)
        {
            return JObject.Parse(Encoding.UTF8.GetString(message));
        }

        protected override byte[] EncodeBody<T>(T messageType)
        {
            var sb = new StringBuilder();
            var sr = new StringWriter(sb);
            _serializer.Serialize(sr, messageType);
            return Encoding.UTF8.GetBytes(sb.ToString());
        }
    }

XML协议类

TODO

通信信息适配

   [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class RouteAttribute : Attribute
    {
        public string Path { get; }

        public RouteAttribute(string path) => Path = path;
    }

    public abstract class MessageDispatcher<TMessageType> where TMessageType : class, new()
    {
        public abstract void Register<TParm, TResult>(Func<TParm, Task<TResult>> target);

        public abstract void Register<TParm>(Func<TParm, Task> target);

        public abstract Task<TMessageType> DispatchAsync(TMessageType message);
    }

    public class XDocumentMessageDispatch : MessageDispatcher<XDocument>
    {
        readonly List<(string xpathExpresstion, Func<XDocument, Task<XDocument>> targerMethod)> _handlers
            = new List<(string xpathExpresstion, Func<XDocument, Task<XDocument>> targerMethod)>();
        public override async Task<XDocument> DispatchAsync(XDocument message)
        {
            foreach (var (path, target) in _handlers)
            {
                if ((message.XPathEvaluate(path) as bool?) == true)
                {
                    return await target(message);
                }
            }
            return null;
        }

        public override void Register<TParm, TResult>(Func<TParm, Task<TResult>> target)
        {
            throw new NotImplementedException();
        }

        public override void Register<TParm>(Func<TParm, Task> target)
        {
            throw new NotImplementedException();
        }

        private string GetXPathRoute(MethodInfo methodInfo)
        {
            var routeAttribute = methodInfo.GetCustomAttribute<RouteAttribute>();
            if (routeAttribute == null)
                throw new ArgumentException($"Method { methodInfo.Name} missing required RouteAttribute");
            return $"boolean ({routeAttribute.Path})";
        }
    }
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:34:02  更:2021-08-04 11:36:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 3:59:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码