Добавление параметра о подключившихся клиентах к server'y
Есть конструкция, но как её приспособить к своему серверу не пойму. Нужно сделать так, чтобы в файл записывалось кол-во находящихся клиентов на сервере (на каждое подключение) на данный момент. Типо " в сети: 1" Подключился еще 1 - " в сети:2 " Код клиента один и тот же на 2 решения(клиента) Вот сама конструкция:
protected internal void AddConnection(ClientObject clientObject)
{
clients.Add(clientObject);
// создать файл по пути path предварительно
using var sw = File.AppendText(path))
sw.WriteLine($"Подключился клиент, в сети: {clients.Count}");
}
// ClientObject
public ClientObject(TcpClient tcpClient)
{
Id = Guid.NewGuid().ToString();
client = tcpClient;
}
Добавлял в сервер в эту часть:
protected internal void Listen()
{
try
{
tcpListener = new TcpListener(IPAddress.Any, 8888);
tcpListener.Start();
Console.Beep(308, 200);
Console.Beep(372, 200);
Console.Beep(495, 200);
Console.WriteLine("===============");
Console.WriteLine("Сервер запущен. Ожидание подключений...");
Console.WriteLine("===============");
while (true)
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();
ClientObject clientObject = new ClientObject(tcpClient);
AddConnection(clientObject);
Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
clientThread.Start();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
Disconnect();
}
}
protected internal void AddConnection(ClientObject clientObject)
{
clients.Add(clientObject);
// создать файл по пути path предварительно
using var sw = File.AppendText(path))
sw.WriteLine($"Подключился клиент, в сети: {clients.Count}");
}
// ClientObject
public ClientObject(TcpClient tcpClient)
{
Id = Guid.NewGuid().ToString();
client = tcpClient;
}
Вот сам код сервера:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;
namespace Laba10
{
public class ServerObject
{
static TcpListener tcpListener; // сервер для прослушивания
List<ClientObject> clients = new List<ClientObject>(); // все подключения
protected internal void AddConnection(ClientObject clientObject)
{
clients.Add(clientObject);
}
protected internal void RemoveConnection(string id)
{
// получаем по id закрытое подключение
ClientObject client = clients.FirstOrDefault(c => c.Id == id);
// и удаляем его из списка подключений
if (client != null)
clients.Remove(client);
}
// прослушивание входящих подключений
protected internal void Listen()
{
try
{
tcpListener = new TcpListener(IPAddress.Any, 8888);
tcpListener.Start();
Console.Beep(308, 200);
Console.Beep(372, 200);
Console.Beep(495, 200);
Console.WriteLine("===============");
Console.WriteLine("Сервер запущен. Ожидание подключений...");
Console.WriteLine("===============");
while (true)
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();
ClientObject clientObject = new ClientObject(tcpClient, this);
Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
clientThread.Start();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
Disconnect();
}
}
// трансляция сообщения подключенным клиентам
protected internal void BroadcastMessage(string message, string id)
{
byte[] data = Encoding.Unicode.GetBytes(message);
for (int i = 0; i < clients.Count; i++)
{
if (clients[i].Id != id) // если id клиента не равно id отправляющего
{
clients[i].Stream.Write(data, 0, data.Length); //передача данных
}
}
}
// отключение всех клиентов
protected internal void Disconnect()
{
tcpListener.Stop(); //остановка сервера
for (int i = 0; i < clients.Count; i++)
{
clients[i].Close(); //отключение клиента
}
Environment.Exit(0); //завершение процесса
}
}
public class ClientObject
{
protected internal string Id { get; private set; }
protected internal NetworkStream Stream { get; private set; }
string userName;
TcpClient client;
ServerObject server; // объект сервера
public ClientObject(TcpClient tcpClient, ServerObject serverObject)
{
Id = Guid.NewGuid().ToString();
client = tcpClient;
server = serverObject;
serverObject.AddConnection(this);
}
public void Process()
{
try
{
Stream = client.GetStream();
// получаем имя пользователя
string message = GetMessage();
userName = message;
message = "║ " + userName + " вошел в чат" + " ║";
var line = "╔" + new string('═', message.Length - 2) + "╗";
var line2 = "╚" + new string('═', message.Length - 2) + "╝";
// посылаем сообщение о входе в чат всем подключенным пользователям
server.BroadcastMessage(message, this.Id);
Console.Beep(308, 250);
Console.WriteLine("===============");
Console.WriteLine(line);
Console.WriteLine(message);
Console.WriteLine(line2);
Console.WriteLine("===============");
// в бесконечном цикле получаем сообщения от клиента
while (true)
{
try
{
message = GetMessage();
message = message.ToString();
string UserName = "║ " + userName.ToString() + " ║";
line = "╔" + new string('═', UserName.Length - 2) + "╗";
line2 = "╚" + new string('═', UserName.Length - 2) + "╝";
Console.Beep(460, 250);
Console.WriteLine(line);
Console.WriteLine(UserName + " " + message);
Console.WriteLine(line2);
server.BroadcastMessage(message, this.Id);
}
catch
{
Console.Beep(290, 250);
Console.WriteLine("===============");
message = "║ " + String.Format("{0} покинул чат", userName) + " ║";
line = "╔" + new string('═', message.Length - 2) + "╗";
line2 = "╚" + new string('═', message.Length - 2) + "╝";
Console.WriteLine(line);
Console.WriteLine(message);
Console.WriteLine(line2);
Console.WriteLine("===============");
server.BroadcastMessage(message, this.Id);
break;
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.ReadKey();
}
finally
{
// в случае выхода из цикла закрываем ресурсы
server.RemoveConnection(this.Id);
Close();
}
}
// чтение входящего сообщения и преобразование в строку
private string GetMessage()
{
byte[] data = new byte[64]; // буфер для получаемых данных
StringBuilder builder = new StringBuilder();
int bytes = 0;
do
{
bytes = Stream.Read(data, 0, data.Length);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (Stream.DataAvailable);
return builder.ToString();
}
// закрытие подключения
protected internal void Close()
{
if (Stream != null)
Stream.Close();
if (client != null)
client.Close();
}
}
class Program
{
static ServerObject server; // сервер
static Thread listenThread; // потока для прослушивания
static void Main(string[] args)
{
Console.Title = "Сервер";
try
{
server = new ServerObject();
listenThread = new Thread(new ThreadStart(server.Listen));
listenThread.Start(); //старт потока
}
catch (Exception ex)
{
server.Disconnect();
Console.WriteLine(ex.Message);
Console.ReadKey();
}
}
}
}