/// <summary> /// Accepts pending client connections and begins listening for packets on each accepted client. /// </summary> private void Accept() { running = true; if (StartedEvent != null) { StartedEvent(this); } while (Status) { if (!Listener.Pending()) { continue; } TcpClientHandler client = (ClientCreatedEvent != null) ? ClientCreatedEvent(Binder, this, ClientTimeout) : new TcpClientHandler(Binder, this, ClientTimeout); client.Receiver = Listener.AcceptTcpClient(); client.Connected = true; if ((ClientMap.Count <= MaxConnections && MaxConnections >= 0) || MaxConnections <= 0) { TcpClient receiver = client.Receiver; receiver.LingerState = new LingerOption(false, 0); receiver.NoDelay = true; client.Stream = receiver.GetStream(); ClientMap.Add(client.Socket, client); ThreadPool.QueueUserWorkItem(thread => Handle(client)); } else { if (ClientOverflowEvent != null) { ThreadPool.QueueUserWorkItem(thread => ClientOverflowEvent(client)); } client.Close(); } } if (ClosedEvent != null) { ClosedEvent(this); } running = false; Close(); }
public void Execute(HttpRequest httpRequest, JsonPacket jsonRequest, SessionComponent session) { // Connect NetworkChannel channel = new NetworkChannel(Connection); // Request JsonJoinRequestMessage jsonRequestMessage = JsonJoinRequestMessage.Parse(jsonRequest.Message); // Data JsonEntity jsonEntity = jsonRequestMessage.Entity; Entity entity = EntityMap.Get(jsonEntity.Id); if (entity != null) { entity.Shutdown(); } entity = session.Owner; entity.Id = jsonEntity.Id; EntityMap.Add(entity.Id, entity); Server.Entities = EntityMap.Count; JsonGroup jsonGroup = jsonRequestMessage.Group; if (jsonGroup == null) { jsonGroup = JsonGroup.Default; } JsonClient jsonClient = jsonRequestMessage.Client; ClientComponent client = new ClientComponent(jsonClient.Id, jsonClient.Name); entity.Add(client); ClientMap.Add(client.Id, entity); Server.Clients = ClientMap.Count; GroupComponent group = new GroupComponent(jsonGroup.Id); entity.Add(group); GroupList.Add(group.Id, entity); Server.Groups = GroupList.Count; SearchListComponent download = new SearchListComponent(); entity.Add(download); // Response JsonJoinResponseMessage jsonResponseMessage = new JsonJoinResponseMessage() { Entities = Server.Entities, Sessions = Server.Sessions, Clients = Server.Clients, Groups = Server.Groups }; JsonPacket jsonResponse = new JsonPacket(jsonResponseMessage); HttpResponse httpResponse = new HttpResponse() { Data = session.Encrypt(jsonResponse) }; channel.Send(httpResponse); #if DEBUG Log.Add(httpRequest, httpResponse, jsonRequest, jsonResponse); #endif }