Beispiel #1
0
        void OnClientDisconnected(ChatClientHolder client)
        {
            var message = $"Client disconnected: {client.Name}.{Environment.NewLine}";

            clients.Remove(client);
            Console.Write(message);
            BroadcastMessage(message);
        }
Beispiel #2
0
 void BroadcastMessage(string message, ChatClientHolder owner = null)
 {
     lock (clients)
     {
         byte[] writeBuffer = Encoding.UTF8.GetBytes(message);
         foreach (var client in clients)
         {
             if ((owner == null) || (owner != client))
             {
                 var stream = client.Client.GetStream();
                 stream.Write(writeBuffer, 0, writeBuffer.Length);
             }
         }
     }
 }
Beispiel #3
0
        void ProcessClient(Task <TcpClient> task)
        {
            var client = task.Result;
            var index  = 0;

            lock ( clients )
            {
                index = clients.Count;
            }
            var holder = new ChatClientHolder(client, index);

            OnClientConnected(holder);
            var stream     = client.GetStream();
            var readBuffer = new byte[1024];

            while (true)
            {
                if (!IsClientConnected(client))
                {
                    break;
                }
                try
                {
                    var messageBuilder = new StringBuilder();
                    int readBytes      = 0;
                    do
                    {
                        readBytes = stream.Read(readBuffer, 0, readBuffer.Length);
                        messageBuilder.AppendFormat("{0}", Encoding.UTF8.GetString(readBuffer, 0, readBytes));
                    }while(stream.DataAvailable);
                    if (messageBuilder.Length > 0)
                    {
                        var message = messageBuilder.ToString().TrimEnd();
                        message = $"{holder.Name}: \"{message}\"{Environment.NewLine}";
                        Console.WriteLine(message);
                        BroadcastMessage(message, holder);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine($"Exception in ProcessClient: {e.Message}");
                    break;
                }
            }
            OnClientDisconnected(holder);
            client.Dispose();
        }