发布1117
大石头 编写于 2019-11-17 17:50:03
NewLife.Net
using System;
using NewLife;
using NewLife.Agent;
using NewLife.Log;
using NewLife.Net;
using NewLife.Threading;

namespace EchoAgent
{
    class Program
    {
        static void Main(String[] args)
        {
            // 引导进入我的服务控制类
            MyService.ServiceMain();
        }
    }

    class MyService : AgentServiceBase<MyService>
    {
        public MyService()
        {
            ServiceName = "EchoAgent";
            DisplayName = "回声服务";
            Description = "这是NewLife.Net的一个回声服务示例!";
        }

        MyNetServer _Server;
        /// <summary>开始服务</summary>
        /// <param name="reason"></param>
        protected override void StartWork(String reason)
        {
            // 实例化服务端,指定端口,同时在Tcp/Udp/IPv4/IPv6上监听
            var svr = new MyNetServer
            {
                Port = 1234,
                Log = XTrace.Log,
#if DEBUG
                SocketLog = XTrace.Log,
                LogSend = true,
                LogReceive = true,
#endif
            };
            svr.Start();

            _Server = svr;

            _timer1 = new TimerX(s => ShowStat(_Server), null, 1000, 1000) { Async = true };
            _timer2 = new TimerX(s => SendTime(_Server), null, 1000, 1000) { Async = true };

            base.StartWork(reason);
        }

        /// <summary>停止服务</summary>
        /// <param name="reason"></param>
        protected override void StopWork(String reason)
        {
            _Server.TryDispose();
            _Server = null;

            base.StopWork(reason);
        }

        private TimerX _timer1;
        private TimerX _timer2;

        private String _last;
        /// <summary>显示服务端状态</summary>
        /// <param name="ns"></param>
        private void ShowStat(NetServer ns)
        {
            if (ns == null) return;

            var msg = ns.GetStat();
            if (msg == _last) return;

            _last = msg;

            WriteLog(msg);
        }

        /// <summary>向所有客户端发送时间</summary>
        /// <param name="ns"></param>
        private void SendTime(NetServer ns)
        {
            if (ns == null) return;

            var str = DateTime.Now.ToFullString() + Environment.NewLine;
            var buf = str.GetBytes();
            ns.SendAllAsync(buf);
        }
    }
}