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的协议,如需转载请自行联系原博主。