Beispiel #1
0
        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());
        }
Beispiel #2
0
 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);
     }
 }
Beispiel #3
0
        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);
                            }
                        }
                    }
                }
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 private void Server_OnConnectionAccepted(object sender, PingPacketEvent e)
 {
     WriteOutput("Client Connected: " + e.Sender.Socket.RemoteEndPoint.ToString());
 }
Beispiel #6
0
 private void Server_OnPacketReceived(object sender, PingPacketEvent e)
 {
     WriteOutput("Connection OK!");
 }
Beispiel #7
0
 private void Server_OnPacketSent(object sender, PingPacketEvent e)
 {
     WriteOutput("Ping OK!");
 }