FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议

简介:

FastSocket这个东西上次我已经说过,它使用简单,功能强大,扩展灵活,目前在新浪的生产环境中已经被广泛使用,所以它的性能,安全等各方面我们绝对可以信赖,今天我们来说一个话题,和上一讲有关,这次我们制作一个基于FastSocket的传输协议,它的意义重大,当fastSocket提供的协议不能满足项目要求时,我们就必须硬着头皮去自己写了,还好,fastsocket为我们铺好了路,我们只要按着这条路走下去,就可以了。

自定义的协议格式如下

说干就干

首先,如果要想扩展一个自己的协议,要对 client和server端分别进行开发,下面我们来看一下client的开发

我们要添加的类有三个文件组成,分别是DSSBinaryProtocol,DSSBinaryResponse和一个使用这个协议的客户端入口DSSBinarySocketClient

DSSBinaryProtocol

  View Code

DSSBinaryResponse

  View Code

DSSBinarySocketClient

  View Code

然后,我们再来说一下server端的开发,它有两个文件组成,分别是DSSBinaryCommandInfo,DSSBinaryProtocol

DSSBinaryCommandInfo

  View Code

DSSBinaryProtocol

  View Code

除了上面两个文件外,我们还要修改服务端的管理类

    /// <summary>
    /// Socket server manager.
    /// </summary>
    public class SocketServerManager
    {
        #region Private Members
        static private readonly List<SocketBase.IHost> _listHosts = new List<SocketBase.IHost>();
        #endregion

        #region Static Methods
        /// <summary>
        /// 初始化Socket Server
        /// </summary>
        static public void Init()
        {
            Init("socketServer");
        }
        /// <summary>
        /// 初始化Socket Server
        /// </summary>
        /// <param name="sectionName"></param>
        static public void Init(string sectionName)
        {
            if (string.IsNullOrEmpty(sectionName)) throw new ArgumentNullException("sectionName");
            Init(ConfigurationManager.GetSection(sectionName) as Config.SocketServerConfig);
        }
        /// <summary>
        /// 初始化Socket Server
        /// </summary>
        /// <param name="config"></param>
        static public void Init(Config.SocketServerConfig config)
        {
            if (config == null) throw new ArgumentNullException("config");
            if (config.Servers == null) return;

            foreach (Config.Server serverConfig in config.Servers)
            {
                //inti protocol
                var objProtocol = GetProtocol(serverConfig.Protocol);
                if (objProtocol == null) throw new InvalidOperationException("protocol");

                //init custom service
                var tService = Type.GetType(serverConfig.ServiceType, false);
                if (tService == null) throw new InvalidOperationException("serviceType");

                var serviceFace = tService.GetInterface(typeof(ISocketService<>).Name);
                if (serviceFace == null) throw new InvalidOperationException("serviceType");

                var objService = Activator.CreateInstance(tService);
                if (objService == null) throw new InvalidOperationException("serviceType");

                //init host.
                var host = Activator.CreateInstance(typeof(SocketServer<>).MakeGenericType(
                    serviceFace.GetGenericArguments()),
                    objService,
                    objProtocol,
                    serverConfig.SocketBufferSize,
                    serverConfig.MessageBufferSize,
                    serverConfig.MaxMessageSize,
                    serverConfig.MaxConnections) as BaseSocketServer;

                host.AddListener(serverConfig.Name, new IPEndPoint(IPAddress.Any, serverConfig.Port));

                _listHosts.Add(host);
            }
        }
        /// <summary>
        /// get protocol.
        /// </summary>
        /// <param name="protocol"></param>
        /// <returns></returns>
        static public object GetProtocol(string protocol)
        {
            switch (protocol)
            {
                case Protocol.ProtocolNames.AsyncBinary:
                    return new Protocol.AsyncBinaryProtocol();
                case Protocol.ProtocolNames.Thrift:
                    return new Protocol.ThriftProtocol();
                case Protocol.ProtocolNames.CommandLine:
                    return new Protocol.CommandLineProtocol();
                case Protocol.ProtocolNames.DSSBinary:
                    return new Protocol.DSSBinaryProtocol();
            }
            return Activator.CreateInstance(Type.GetType(protocol, false));
        }

        /// <summary>
        /// 启动服务
        /// </summary>
        static public void Start()
        {
            foreach (var server in _listHosts) server.Start();
        }
        /// <summary>
        /// 停止服务
        /// </summary>
        static public void Stop()
        {
            foreach (var server in _listHosts) server.Stop();
        }
        #endregion
    }

从上面的代码中,我们看到了自己新加的协议DSSBinary,我们可以在配置文件中对它进行配置,方法和之前说的一样,在这里就不再重复了。

感谢各位的阅读!

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议,如需转载请自行联系原博主。

相关文章
【网络安全】数据包拓展
【网络安全】数据包拓展
105 0
网络安全-数据包拓展
【4月更文挑战第2天】数据包拓展
"网络世界的守护者:一探究竟TCP协议如何确保数据传输的绝对安全与可靠"
【8月更文挑战第20天】传输控制协议(TCP)是网络通信中的核心协议之一,它确保数据包能可靠、有序地从源头传输到目的地。TCP采用三次握手的方式建立连接,并通过序列号、确认应答及超时重传来保障数据传输的准确性。此外,TCP还具备流量控制与拥塞控制功能,避免网络拥塞。虽然TCP在可靠性上表现优异,但在快速传输场景中可能存在局限。深入理解TCP对于网络工程师和开发者至关重要。
139 1
|
8月前
共识协议的技术变迁问题之Mencius的灵感对后来的共识协议有何影响
共识协议的技术变迁问题之Mencius的灵感对后来的共识协议有何影响
84 12
必知的技术知识:eDonkey协议
必知的技术知识:eDonkey协议
【底层服务/编程功底系列】「网络通信体系」带你攻克网络技术之TCP协议的三次握手和四次链接的技术盲区
【底层服务/编程功底系列】「网络通信体系」带你攻克网络技术之TCP协议的三次握手和四次链接的技术盲区
75 0
8月11日|CSA研讨会:国标要点解读《信息安全技术 个人信息处理中告知和同意实施指南》
2023年8月11日(本周五)19:00-20:30,由CSA大中华区隐私与个人信息保护法律工作组举办CSA研讨会—国家标准: 个人信息处理中告知和同意实施指南解读与实践分享
8月11日|CSA研讨会:国标要点解读《信息安全技术 个人信息处理中告知和同意实施指南》
谈谈数据标准如何制定
数据标准是打破数据孤岛和创建互操作性或在不同系统和组织之间交换数据的能力的关键。
谈谈数据标准如何制定
【计算机网络】再谈应用层——电子邮件相关
电子邮件信息格式 RFC 5322(最基本的格式,the Internet Message Format) 形式: to Cc(抄送) Bcc(盲抄送,对方无法得知该消息还抄送给了谁)
161 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等