Example #1
0
 private void AcceptCb(IAsyncResult ar)
 {
     try
     {
         Socket sock  = listenfd.EndAccept(ar);
         int    index = NewIndex();
         tcps[index] = new TCP();
         if (index < 0)
         {
             sock.Close();
             Console.WriteLine("【Warning】The Maximum number of connections has been reached");
         }
         else
         {
             TCP conn = tcps[index];
             conn.Init(sock);
             string adr = conn.GetAddress();
             Console.WriteLine("Client connection [" + adr + "] ConnectionPool ConnectionID= " + index);
             conn.socket.BeginReceive(conn.readbuffer, conn.buffercount, conn.BuffRmain(), SocketFlags.None, ReceiveCb, conn);
             listenfd.BeginAccept(AcceptCb, null);
         }
     }
     catch (Exception e)
     {
         Console.WriteLine("AcceptCb Defeated" + e.Message);
     }
 }
Example #2
0
        public string GetServerInfo(ProtocolBytes bytes, TCP conn)
        {
            object[] vs = new object[] { bytes, conn };
            object   O  = vs;
            Thread   ThreadGetServerInfo = new Thread(new ParameterizedThreadStart(GetINFO));

            ThreadGetServerInfo.Name = "ThreadGetServerInfo";
            ThreadGetServerInfo.Start(O);
            return(ThreadServerInfo);
        }
Example #3
0
 public void CloseTCP(TCP conn)
 {
     for (int i = 0; i < tcps.Length; i++)
     {
         if (tcps[i] == conn)
         {
             tcps[i] = null;
         }
     }
     conn.Close();
 }
Example #4
0
 public void Send(TCP conn, ProtocolBase protoco)
 {
     byte[] bytes    = protoco.Encode();
     byte[] lenght   = BitConverter.GetBytes(bytes.Length);
     byte[] sendbuff = lenght.Concat(bytes).ToArray();
     try
     {
         conn.socket.BeginSend(sendbuff, 0, sendbuff.Length, SocketFlags.None, null, null);
     }
     catch (Exception e)
     {
         Console.WriteLine("[发送消息] 错误:" + e.Message);
     }
 }
Example #5
0
 public void Close()
 {
     for (int i = 0; i < tcps.Length; i++)
     {
         TCP conn = tcps[i];
         if (conn == null)
         {
             continue;
         }
         if (!conn.isUse)
         {
             continue;
         }
         lock (conn)
             conn.Close();
     }
 }
Example #6
0
        public void GetINFO(object O)
        {
            string     serverinfoStr;
            ServerInfo serverinfo = new ServerInfo();

            ServerConn[]  ServerArr = new ServerConn[OnlineServer.Count];
            object[]      vs        = (object[])O;
            ProtocolBytes bytes     = (ProtocolBytes)vs[0];
            TCP           conn      = (TCP)vs[1];
            int           i         = 0;

            foreach (ServerConn SC in OnlineServer)
            {
                ServerArr[i] = SC;
                i++;
            }
            for (int a = 0; a < ServerArr.Length - 1; a++)
            {
                for (int b = a + 1; b < ServerArr.Length; b++)
                {
                    if (ServerArr[a].UNitl > ServerArr[b].UNitl)
                    {
                        ServerConn Temp = ServerArr[a];
                        ServerArr[a] = ServerArr[b];
                        ServerArr[b] = Temp;
                    }
                }
            }
            if (ServerArr.Length == 0)
            {
                bytes.AddData(1);
                conn.Send(bytes);
                "MSG_Server: 没有启动".ColorWord(ConsoleColor.DarkRed);
                return;
            }
            bytes.AddData(0);
            serverinfo.IP           = ServerArr[0].IP;
            serverinfo.Port         = ServerArr[0].Port;
            serverinfo.ServerVrsion = ServerArr[0].Server_Vrsion;
            serverinfoStr           = JsonConvert.SerializeObject(serverinfo);

            Console.WriteLine("ToClient " + serverinfo.IP + " " + serverinfo.Port.ToString());
            bytes.AddData(serverinfoStr);
            bytes.AddData(conn.Player.ReConnectCheckCode);
            conn.Send(bytes);
        }
Example #7
0
 public int NewIndex()
 {
     if (tcps == null)
     {
         return(-1);
     }
     for (int i = 0; i < tcps.Length; i++)
     {
         if (tcps[i] == null)
         {
             tcps[i] = new TCP();
             return(i);
         }
         else if (tcps[i].isUse == false)
         {
             return(i);
         }
     }
     return(-1);
 }
Example #8
0
        private void BindingPlayer(object obj)
        {
            object[] vs     = (object[])obj;
            string   openid = vs[0].ToString();
            EndPoint Client = (EndPoint)vs[1];

            for (int i = 0; i < NMC.instance.tcps.Length; i++)
            {
                try
                {
                    if (NMC.instance.tcps[i] == null)
                    {
                        continue;
                    }
                    TCP Conn = NMC.instance.tcps[i];
                    if (Conn == null)
                    {
                        continue;
                    }
                    if (Conn.Player == null)
                    {
                        continue;
                    }
                    if (Conn.Player.Openid == openid)
                    {
                        Conn.Player.UDPClient = Client;
                        Conn.Player.Room.RightMethod(Conn.Player);
                        Conn.Player.Room.UDP_ClientList.Add(Client);
                        if (!valuePairs.ContainsKey(Client))
                        {
                            valuePairs.Add(Client, Conn.Player);
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
Example #9
0
        public void hearBeat()
        {
            long timeNow = Sys.GetTimeStamp();

            for (int i = 0; i < tcps.Length; i++)
            {
                TCP conn = tcps[i];
                if (conn == null)
                {
                    continue;
                }
                if (!conn.isUse)
                {
                    continue;
                }
                if (conn.lastTickTime < timeNow - hearBeatTime)
                {
                    Console.WriteLine("[Heartbeat Cause DisConnection :]" + conn.GetAddress());
                    lock (conn)
                        CloseTCP(conn);
                    Console.WriteLine("DisConnetcion");
                }
            }
        }
Example #10
0
        private void ProcessData(object con)
        {
            TCP conn = (TCP)con;

            if (conn.buffercount < sizeof(Int32))
            {
                return;
            }
            //
            Array.Copy(conn.readbuffer, conn.lenbytes, sizeof(Int32));
            conn.msgLenght = BitConverter.ToInt32(conn.lenbytes, 0);
            if (conn.buffercount < conn.msgLenght + sizeof(Int32))
            {
                return;
            }
            //处理消息
            ProtocolBase protoco = Proto.Decode(conn.readbuffer, sizeof(Int32), conn.msgLenght);

            try
            {
                HandleMsg(conn, protoco);
            }
            catch (Exception e)
            {
                Console.WriteLine("HandleMsg  " + e.Message);
            }
            //发送消息
            int count = conn.buffercount - conn.msgLenght - sizeof(Int32);

            Array.Copy(conn.readbuffer, sizeof(Int32) + conn.msgLenght, conn.readbuffer, 0, count);
            conn.buffercount = count;
            if (conn.buffercount > 0)
            {
                ProcessData(conn);
            }
        }
Example #11
0
        private void HandleMsg(TCP conn, ProtocolBase protoBase)
        {
            ProtocolBytes bytes = (ProtocolBytes)protoBase;
            // Console.WriteLine("收到" + bytes.ProtocolName().ToString());
            string name  = bytes.Protocol.ToString();
            int    index = name.LastIndexOf("_");

            name = name.Substring(index + 1);
            object[] OB = bytes.GetDecode();
            string   s  = "";

            for (int i = 0; i < bytes.GetDecode().Length; i++)
            {
                s += bytes.GetDecode()[i].ToString();
            }
            //if (s != "HearBeat")
            Console.WriteLine(name + " " + s);
            string methodname = name;

            if (ProtocolSort.FriendProtocol.Contains(bytes.Protocol))
            {
                MethodInfo mm  = HandFriendEventMP.GetType().GetMethod(methodname);
                object[]   obj = new object[] { conn, OB };
                mm.Invoke(HandFriendEventMP, obj);
            }
            else if (bytes.Protocol == Fursion_Protocol.LockStep)
            {
                try
                {
                    MethodInfo mm  = handFPSMsg.GetType().GetMethod(methodname);
                    object[]   obj = new object[] { protoBase };
                    mm.Invoke(handFPSMsg, obj);
                }
                catch (Exception e)
                { Console.WriteLine(e.Message + " 221"); }
            }
            else if (ProtocolSort.MSGProtocol.Contains(bytes.Protocol))
            {
                try
                {
                    MethodInfo mm = handleConnMP.GetType().GetMethod(methodname);
                    if (mm == null)
                    {
                        string str = "[Warning]HandleMsg Don't Have method precessing method in HandleConnMethodPool" + bytes.Protocol;
                        Console.WriteLine(str + methodname);
                    }
                    object[] obj = new object[] { protoBase };
                    mm.Invoke(handleConnMP, obj);
                }
                catch (Exception e)
                { Console.WriteLine(e.Message + "  239"); }
            }
            else if (conn.Player == null || ProtocolSort.ConnectProtocol.Contains(bytes.Protocol) || name == "JSONTEST")
            {
                try
                {
                    MethodInfo mm = handleConnMP.GetType().GetMethod(methodname);
                    if (mm == null)
                    {
                        string str = "【warning】 handlemsg没有处理连接方法";
                        Console.WriteLine(str + methodname);
                        if (conn.Player == null)
                        {
                            ProtocolBytes RestConnect = new ProtocolBytes();
                            RestConnect.SetProtocol(Fursion_Protocol.Reconnect);
                            conn.Send(RestConnect);
                        }
                    }
                    object[] obj = new object[] { conn, protoBase };
                    try
                    {
                        mm.Invoke(handleConnMP, obj);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message + "256");
                    }
                }
                catch (Exception e)
                { Console.WriteLine(e.Message + "  261"); }
            }
            else if (ProtocolSort.TeamProtocol.Contains(bytes.Protocol))
            {
                try
                {
                    MethodInfo mm = HandTeameEventMP.GetType().GetMethod(methodname);
                    if (mm == null)
                    {
                        string str = "【warning】 Don't Method precessing in HandTeameEventMP";
                        Console.WriteLine(str + methodname);
                    }
                    object[] obj = new object[] { conn, protoBase };
                    try
                    {
                        mm.Invoke(HandTeameEventMP, obj);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message + "256");
                    }
                }
                catch (Exception e)
                { Console.WriteLine(e.Message + "  261"); }
            }
            else if (ProtocolSort.LockStepProtocol.Contains(bytes.Protocol))
            {
            }
            else
            {
                try
                {
                    MethodInfo mm = handlePlayerEvent.GetType().GetMethod(methodname);
                    if (mm == null)
                    {
                        if (conn.Player == null)
                        {
                            ProtocolBytes RestConnect = new ProtocolBytes();
                            RestConnect.SetProtocol(Fursion_Protocol.Reconnect);
                            conn.Send(RestConnect);
                        }
                        string str = "[警告]handlemsg没有处理玩家方法";
                        Console.WriteLine(str + methodname);
                    }
                    object[] obj = new object[] { conn, protoBase };
                    Console.WriteLine("[处理玩家消息]" + conn.GetAddress() + name);
                    mm.Invoke(handlePlayerEvent, obj);
                }
                catch (Exception e)
                { Console.WriteLine(e.Message + "  247"); }
            }
        }