Пример #1
0
        /// <summary>
        /// 开启套接字监听
        /// 向主节点发送登记,登记成功,并返回可用的端口,然后开启指定端口的子节点server
        /// </summary>

        public static void Start()
        {
            try
            {
                if (false == GlobalContext.IsConfigClusteringMode)//是否开启集群模式
                {
                    return;
                }

                //一旦主控节点开启并正确返回结果
                if (!MasterRemoteServer.IsMasterStarted())
                {
                    return;
                }

                //进入监控进程broker
                AppBroker.MonitorIsMasterCenterAlive();

                int port = 0;

                var slaveIdentity = Guid.NewGuid().ToString().ToLower();
                //开启监听前 ,发送注册当前从节点到主节点,如果可以登记注册成功,那么服务端分配端口
                port = MasterRemoteServer.RegisterSlaveToMaster(slaveIdentity);
                int counter = 1;
                //注册失败后 再次尝试3次
                while (port <= 0 && counter <= 3)
                {
                    port     = MasterRemoteServer.RegisterSlaveToMaster(slaveIdentity);
                    counter += 1;
                    RunningLocker.CreateNewLock().CancelAfter(1000);//延迟并发,防止端口资源抢占
                }
                if (port <= 0)
                {
                    Console.WriteLine("未成功注册从节点端口!");
                    return;//一旦服务端返回无效端口 那么禁止从节点启动监听
                }



                listener = new NTCPMessage.Server.NTcpListener(new IPEndPoint(IPAddress.Any, port));
                listener.DataReceived       += new EventHandler <ReceiveEventArgs>(ReceiveEventHandler);
                listener.ErrorReceived      += new EventHandler <ErrorEventArgs>(ErrorEventHandler);
                listener.RemoteDisconnected += new EventHandler <DisconnectEventArgs>(DisconnectEventHandler);

                GlobalContext.IsInSlaveMode = true;//标识正在从节点下工作

                //开启从节点的监听
                listener.Listen();
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
            }


            System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
        }