三、Unity3D与SuperSocket开源项目跑得快棋牌游戏-Ping服务器

一、说明

阅读本文前,推荐阅读

  • SuperSocket官方中文文档http://docs.supersocket.net/v1-6/zh-CN

二、服务器工程

runner项目(开源跑得快)
地址:https://139.199.213.123/svn/runner/
用户:runner
密码:abc123
权限:read

三、Unity3D与SuperSocket开源项目跑得快棋牌游戏-Ping服务器_第1张图片
image.png

三、代码示例

  • 本项目使用Visual Studio 2015
  • 使用nuget引用log4net,SuperSocket,SuperSocket.Engine程序包
  • 使用SuperSocket头部格式固定并且包含内容长度的协议模版(FixedHeaderReceiveFilter),头部固定两个字节,高字节在前,低字节再后,具体可参考代码
using System;
using System.Text;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.Facility.Protocol;

namespace Ping
{
    public class PingFixedHeaderReceiveFilter : FixedHeaderReceiveFilter
    {
        public PingFixedHeaderReceiveFilter() : base(2)
        {
        }

        protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
        {
            return (int)header[offset] * 256 + (int)header[offset + 1];
        }

        protected override BinaryRequestInfo ResolveRequestInfo(ArraySegment header, byte[] bodyBuffer, int offset, int length)
        {
            string cmd = Encoding.UTF8.GetString(bodyBuffer, offset, length);
            BinaryRequestInfo request = new BinaryRequestInfo(cmd, null);
            return request;
        }
    }
}
  • 实现自己的PingServer,打印客户请求Key,并回复"PING",代码如下
using System;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketBase.Protocol;

namespace Ping
{
    public class PingServer : AppServer
    {
        public PingServer() : base(new DefaultReceiveFilterFactory())
        {

        }

        protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
        {
            return base.Setup(rootConfig, config);
        }

        protected override void OnStarted()
        {
            NewRequestReceived += OnNewRequestReceived;

            base.OnStarted();
        }

        protected override void OnStopped()
        {
            base.OnStopped();
        }

        void OnNewRequestReceived(PingSession session,BinaryRequestInfo info)
        {
            try
            {
                Logger.Debug("request cmd : " + info.Key);

                session.SendMessage();
            }
            catch (Exception ex)
            {
                Logger.Error("ex : " + ex.StackTrace);
            }

            Logger.Debug("SessionCount : " + SessionCount + " TotalHandledRequests : " + TotalHandledRequests);
        }
    }
}
  • 实现自己的PingSession,提供发送"PING"接口,代码如下
using System;
using System.Text;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;

namespace Ping
{
    public class PingSession : AppSession
    {
        #region override
        protected override void OnSessionStarted()
        {
            base.OnSessionStarted();

            Logger.Debug("OnSessionStarted session id : " + SessionID + " SessionCount: " + AppServer.SessionCount);
        }

        protected override void HandleUnknownRequest(BinaryRequestInfo requestInfo)
        {
            base.HandleUnknownRequest(requestInfo);
        }

        protected override void HandleException(Exception e)
        {
            base.HandleException(e);
        }

        protected override void OnSessionClosed(CloseReason reason)
        {
            base.OnSessionClosed(reason);

            Logger.Debug("OnSessionClosed session id : " + SessionID + " SessionCount: " + AppServer.SessionCount);
        }
        #endregion

        public void SendMessage()
        {
            byte[] messageData = Encoding.UTF8.GetBytes("PING");
            byte[] lenData = new byte[] { (byte)(messageData.Length / 256), (byte)(messageData.Length % 256) };//长度
            byte[] sendData = new byte[messageData.Length + lenData.Length];
            Array.Copy(lenData, 0, sendData, 0, lenData.Length);
            Array.Copy(messageData, 0, sendData, lenData.Length, messageData.Length);
            Send(sendData, 0, sendData.Length);
        }
    }
}
  • 在Main函数启动监听,监听端口9090
using System;

namespace Ping
{
    class Program
    {
        static int PORT = 9090;

        static void Main(string[] args)
        {
            StartSuperSocket();
        }

        static void StartSuperSocket()
        {
            var appServer = new PingServer();
            if (!appServer.Setup(PORT))
            {
                Console.WriteLine("Failed to setup!");
                Console.ReadKey();
                return;
            }

            if (!appServer.Start())
            {
                Console.WriteLine("Failed to start!");
                Console.ReadKey();
                return;
            }

            Console.WriteLine("The server started at port : "+ PORT + " successfully,press key 'q' to stop it");

            while (Console.ReadKey().KeyChar != 'q')
            {
                Console.WriteLine();
                continue;
            }

            appServer.Stop();

            Console.WriteLine("the server was stopped!");
            Console.ReadKey();
        }
    }
}
  • 成功启动
三、Unity3D与SuperSocket开源项目跑得快棋牌游戏-Ping服务器_第2张图片
image.png

你可能感兴趣的:(三、Unity3D与SuperSocket开源项目跑得快棋牌游戏-Ping服务器)