void OnClientDisconnected(ChatClientHolder client) { var message = $"Client disconnected: {client.Name}.{Environment.NewLine}"; clients.Remove(client); Console.Write(message); BroadcastMessage(message); }
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); } } } }
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(); }