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); } }
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); }
public void CloseTCP(TCP conn) { for (int i = 0; i < tcps.Length; i++) { if (tcps[i] == conn) { tcps[i] = null; } } conn.Close(); }
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); } }
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(); } }
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); }
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); }
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); } } }
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"); } } }
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); } }
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"); } } }