ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

supersocket实际应用之你画我猜游戏(一)

2022-04-09 15:00:18  阅读:204  来源: 互联网

标签:supersocket header length 应用 new byte public 游戏


supersocket这款组件,让不懂tcp/ip的人都能开发出网络应用。我们不必在开发与自己主要应用不相关的代码了,主要精力都能放在设计业务逻辑上面了。 现在使用现成又完备的组件,真是大大的提高了开发效率。我主要使用的是1.6.5版本的supersocket,用于编写.net framework下的wpf和winform应用。我正在进行的你画我猜玩具项目也只是作为周末的消磨时间的一种方式。另外写winform写多了,写wpf都还像在写winform一样,不过wpf的ui还是具有更强的展示能力。   supersocket v1.6源码地址:https://github.com/kerryjiang/SuperSocket/tree/v1.6 作者博客:https://home.cnblogs.com/u/jzywh/ 在用nuget引用supersocket时,注意组件之间的依赖关系,不然会在使用时出现某个依赖项找不到的问题。因为supersocket引用的组件的签名和自己项目引用的组件的签名不一样造成的。这也是.net为了防止组件被替换为不安全的组件所采取的方式。但这也让许多开发者都有一段头疼的经历。 服务端引用的组件有: 0 我为了调试,就引用的是源码中的项目了。 客户端的引用: SuperSocket,supersocket.clientEngine,supersocket.protobase,supersocket.common   supersocket服务端几个重要的对象:AppServer,Appsession,IRequestInfo,FixedHeaderReceiveFilter。下面就来分别介绍这几个对象。   IRequestInfo是接收实际数据的接口,默认采用StringRequestInfo。我自己定义了一个接收自己的数据类型:
public class DataRequestInfo : IRequestInfo
    {
        public string Key { get; set; }

        public byte[] Data { get; set; }
        public byte[] DataSend { get; set; }
        public DataRequestInfo(string key,byte[] header, byte[] bodyBuffer)
        {
            Key= key;
            int length = ByteConvertHelper.byteArrayToInt(header);

            Data = new byte[length];

            Array.Copy(bodyBuffer, 0, Data, 0, length);
            DataSend=new byte[length+4];
            Array.Copy(header, 0, DataSend, 0, header.Length);
            Array.Copy(bodyBuffer, 0, DataSend, header.Length, bodyBuffer.Length);
        }


    }
View Code Appsession:是连接服务器的一个会话,支持继承。当客户端连接上服务端后,服务端就会产生一个Appsession
public class PaintAppsession : AppSession<PaintAppsession, DataRequestInfo>
    {
        public string IDKey { get { return base.SessionID; } }
       // public string NickName { get; set; }
        
        public ClientPlayerInfo ClientPlayerInfo { get; set; }
        public bool isReady { get; set; }
        protected override void HandleException(Exception e)
        {
          //  var a = e;
        }
    }
View Code AppServer就表示服务端了,也支持继承,AppServer这种是抽象类,必须自己继承。
 public class PaintAppServer : AppServer<PaintAppsession, DataRequestInfo>
    {

        public PaintAppServer(IReceiveFilterFactory<DataRequestInfo> protocol) : base(protocol)
        {
        }
    }
View Code FixedHeaderReceiveFilter表示接收头部固定长度的字节,头部header长度定义为4,每次发送的字节前4个的自己是可以自己定义的,比如存发送的数据包的大小。这个类的作用是把从网络中收到的字节组装成DataRequestInfo。
internal class MyServerReceiveFilter : FixedHeaderReceiveFilter<DataRequestInfo>
    {
        public MyServerReceiveFilter(): base(4)
        {
            
        }
        protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
        {
            var data=new byte[length];
            Array.Copy(header, offset, data, 0, length);
           
            var len = ByteConvertHelper.byteArrayToInt(data);

            return len;
        }

        protected override DataRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
        {
            var data = new byte[length];
            Array.Copy(bodyBuffer.ToArray(), offset, data, 0, length);

            return new DataRequestInfo("key1",header.ToArray(), data);
        }

        public override DataRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest)
        {
            return base.Filter(readBuffer, offset, length, toBeCopied, out rest);
        }

    }
View Code

使用:

appServer = new PaintAppServer(new DefaultReceiveFilterFactory<MyServerReceiveFilter, DataRequestInfo>()); 配置监听:
IServerConfig m_Config = new ServerConfig
            {
                Port = port,
                Ip = "Any",
                MaxConnectionNumber = 1000,
                Mode = SocketMode.Tcp,
                Name = "CustomProtocolServer",
                MaxRequestLength = 10240

            };

            if (appServer.Setup(m_Config, logFactory: new ConsoleLogFactory())){;}
View Code 打开: appServer.Start();

标签:supersocket,header,length,应用,new,byte,public,游戏
来源: https://www.cnblogs.com/HelloQLQ/p/16122039.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有