private void Server_OnConnectionRemoved(object sender, PingPacketEvent e) { if (!_usernames.ContainsKey(e.Sender.ClientId.ToString())) { return; } var notification = new ChatPacket { Username = "******", Message = "A user has left the chat", UserColor = Colors.Purple.ToString() }; var userPacket = new UserConnectionPacket { UserGuid = e.Sender.ClientId.ToString(), Username = _usernames[e.Sender.ClientId.ToString()], IsJoining = false }; if (_usernames.Keys.Contains(userPacket.UserGuid)) { _usernames.Remove(userPacket.UserGuid); } userPacket.Users = _usernames.Values.ToArray(); if (_server.Connections.Count != 0) { Task.Run(() => _server.SendObjectToClients(userPacket)).Wait(); Task.Run(() => _server.SendObjectToClients(notification)).Wait(); } WriteOutput("Client Disconnected: " + e.Sender.Socket.RemoteEndPoint.ToString()); }
public void SendObjectToClients(object package) { foreach (var c in Connections.ToList()) { c.SendObject(package).Wait(); var testPing = new PingPacketEvent(c, c, package); OnPacketSent?.Invoke(this, testPing); } }
private void MonitorStreams() { while (IsRunning) { foreach (var client in Connections.ToList()) { if (!client.IsSocketConnected()) { var removeClientEvent = new PingPacketEvent(client, null, string.Empty); Connections.Remove(client); OnConnectionRemoved?.Invoke(this, removeClientEvent); continue; } if (client.Socket.Available != 0) { var readObject = ReadObject(client.Socket); var testConnection = new PingPacketEvent(client, null, readObject); OnPacketReceived?.Invoke(this, testConnection); if (readObject is PingPacket ping) { client.SendObject(ping).Wait(); continue; } if (readObject is PersonalPacket pp) { var destination = Connections.FirstOrDefault(c => c.ClientId.ToString() == pp.GuidId); var e4 = new PersonalPacketEvent(client, destination, pp); OnPersonalPacketReceived?.Invoke(this, e4); if (destination != null) { destination.SendObject(pp).Wait(); var personPaketEventSuccess = new PersonalPacketEvent(client, destination, pp); OnPersonalPacketSent?.Invoke(this, personPaketEventSuccess); } } else { foreach (var c in Connections.ToList()) { c.SendObject(readObject).Wait(); var waitPacketEvent = new PingPacketEvent(client, c, readObject); OnPacketSent?.Invoke(this, waitPacketEvent); } } } } } }
public async Task <bool> Listen() { while (IsRunning) { if (Socket.Poll(100000, SelectMode.SelectRead)) { var newConnection = Socket.Accept(); if (newConnection != null) { var client = new ClientBase(); var newGuid = await client.CreateGuid(newConnection); await client.SendMessage(newGuid); Connections.Add(client); var emptyPingClientSuccess = new PingPacketEvent(client, null, String.Empty); OnConnectionAccepted?.Invoke(this, emptyPingClientSuccess); } } } return(true); }
private void Server_OnConnectionAccepted(object sender, PingPacketEvent e) { WriteOutput("Client Connected: " + e.Sender.Socket.RemoteEndPoint.ToString()); }
private void Server_OnPacketReceived(object sender, PingPacketEvent e) { WriteOutput("Connection OK!"); }
private void Server_OnPacketSent(object sender, PingPacketEvent e) { WriteOutput("Ping OK!"); }