SteedNet 服务端示例代码

来源:互联网 发布:服装工艺 软件 编辑:程序博客网 时间:2024/04/29 06:50

using SteedNet.AppCommon;

using SteedNet.NetworkCommEngine;

using SteedNet.NetworkCommEngine.Protocol;

using SteedNet.NetworkCommEngine.Sockets;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

 

namespace SteedNet_Server

{

    class Program

    {

        static void Main(string[] args)

        {

            new MyServer().Start();

        }

    }

 

 

    /// <summary>

    /// 服务器类

    /// </summary>

    class MyServer

    {

        private int m_ConnCount = 0;

 

        private readonly object m_lock = newobject();

 

        /// <summary>

        /// 启动服务。

        /// </summary>

        public void Start()

        {

            ISocketListener listener = newSocketListener();

 

            // 接收数据大小

           listener.Settings.SocketSettings.RecvBufferSize = 2048;

 

            // 网络事件处理委托设置

            listener.EventHandlers.OnConnected= this.Server_OnConnected;

           listener.EventHandlers.OnDisconnected = this.Server_OnDisconnected;

            listener.EventHandlers.OnReceived =this.Server_OnReceived;

            listener.EventHandlers.OnSend =this.Server_OnSend;

 

            ushort port = 8085;

            IResult result =listener.Serve(port);

            if (result.Error !=ErrorResults.None)

            {

                Console.WriteLine("服务启动失败。端口:{0}",port);

                return;

            }

            else

            {

                Console.WriteLine("服务启动。端口:{0}",port);

            }

 

            Console.WriteLine("按任意键结束程序。");

            Console.ReadKey();

 

            listener.Close();

        }

 

        private voidServer_OnConnected(ISocketContext _SocketContext, IResult r)

        {

            // 增加一个数据包验证过滤器

            // ProtocolResolver:过滤器使用的数据解析器,构造参数1:协议头标签,构造参数2:协议尾标签

            _SocketContext.AddBufferFilter(newValidationProtocolFilter(new ProtocolResolver(10000, 20000)));

 

            // 增加一个连接计数(不是必须的)

            Interlocked.Increment(refm_ConnCount);

            // 打印连接数

           Console.WriteLine(string.Format("[{0}] 新增一个连接,连接总数:{1}。",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), m_ConnCount));

        }

 

        private voidServer_OnReceived(ISocketContext _SocketContext, IReadDataBuffer ioBuffer,IResult r)

        {

            // 如果接收到数据长度不是0,则处理

            if (ioBuffer.NumBytes != 0)

            {

                //----------------------------- 读取数据 ----------------------------

                // 标准协议处理

                IProtocol protocol = newStandardProtocol(ioBuffer);

 

                int clientID =protocol.ReadInt32(); // 读一个整数

                int msgNum =protocol.ReadInt32(); // 读一个整数

                string message = protocol.ReadString();// 读一个字符串

                // 打印消息

                Console.WriteLine("[{0}] 收到客户端数据:\r\n客户端ID:{1}\r\n消息编号:{2}\r\n消息内容:{3}",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), clientID, msgNum,message);

                // ----------------------------- 结束读取-----------------------------

 

                // ------------------------- 发送数据到服务器-------------------------

                // 可写数据缓冲区

                WriteDataBuffer dataBuffer =new WriteDataBuffer();

                // 标准数据包

                IProtocol protocolWrite = newStandardProtocol(dataBuffer);

                protocolWrite.WriteInt32(msgNum+ 1); // 写入一个整数,假设是消息编号

               protocolWrite.WriteString("我是服务器,这是字符串数据。");

 

                _SocketContext.SendAsync(dataBuffer);

                //----------------------------- 结束发送 -----------------------------

 

            }

        }

 

        private voidServer_OnSend(ISocketContext _SocketContext, IWriteDataBuffer ioBuffer, IResultr)

        {

            Console.WriteLine("[{0}] 数据发送完成。",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

        }

 

        private voidServer_OnDisconnected(ISocketContext _SocketContext, IResult r)

        {

            //lock (m_lock)

            {

                Interlocked.Decrement(ref m_ConnCount);

               Console.WriteLine(string.Format("[{0}] 有一个连接断开,剩余连接数:{1}。", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),m_ConnCount));

            }

        }

    }

}


0 0