C# Socket Как передать значение только одному из клиентов, не всем сразу?

У меня есть сервер:

   class Program
    {
        private const string _serverHost = "localhost";
        private const int _serverPort = 5446;
        private static Thread _serverThread;

        public static List<Client> Clients = new List<Client>();
        static void Main(string[] args)
        {
            StartServer();
        }



        private static void StartServer()
        {
            IPHostEntry iPHost = Dns.GetHostEntry(_serverHost);
            IPAddress iPAddress = iPHost.AddressList[0];
            IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, _serverPort);
            Socket socket = new Socket(iPAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            socket.Bind(iPEndPoint);
            socket.Listen(100);
            Console.WriteLine("Server has been started on IP {0}", iPEndPoint);
            while (true)
            {
                Socket user = socket.Accept();
                NewClient(user);
            }
        }

        private static void NewClient(Socket socket)
        {
            string name = "";
            name = Clients.Count == 0 ? name = "white" : "black";
            Client client = new Client(socket, Clients.Count, name, DateTime.Now.ToShortDateString());
            Clients.Add(client);
            Console.WriteLine($"New client connected on: {socket.RemoteEndPoint}");
        }
    }

public class Client
    {
        private Socket _handler;
        private Thread _thread;
        public int Id { get; set; }
        public string Name { get; set; }
        public string Date { get; set; }

        public Client(Socket socket, int count, string name, string date)
        {
            Id = count++;
            Name = name;
            Date = date;
            _handler = socket;
            _thread = new Thread(Listener);
            _thread.IsBackground = true;
            _thread.Start();


        }

        private void Listener()
        {
            while (true)
            {
                byte[] buffer = new byte[1024];
                int byteRec = _handler.Receive(buffer);
                string data = Encoding.UTF8.GetString(buffer, 0, byteRec);
                HadlCommand(data);
            }
        }

        private void HadlCommand(string data)
        {
            if (data.Contains("Pressed"))
            {
                Send(data);
            }
        }

        private void Send(string data)
        {
            int byteSent = _handler.Send(Encoding.UTF8.GetBytes(data));
            if (byteSent > 0) Console.WriteLine("Success");
        }
    }

И есть клиент:

public partial class ClientForm : Form
{
    private const string _serverHost = "localhost";
    private const int _serverPort = 5446;
    private Socket _serverSocket;
    private Thread _clientThread;
    public ClientForm()
    {
        InitializeComponent();
        Connect();
        _clientThread = new Thread(Listener);
        _clientThread.IsBackground = true;
        _clientThread.Start();

    }

    private void Listener()
    {
        while (_serverSocket.Connected)
        {
            byte[] buffer = new byte[1024];
            int byteRec = _serverSocket.Receive(buffer);
            string data = Encoding.UTF8.GetString(buffer, 0, byteRec);
            if (data.Contains("Pressed"))
            {
                SwitchPlayer();
            }
        }
    }

    private void Send(string data)
    {
        int byteSent = _serverSocket.Send(Encoding.UTF8.GetBytes(data));
        if (byteSent > 0) Console.WriteLine("Success");
    }


    private void SwitchPlayer()
    {
        this.btnPress.Enabled = false;
        Send("Pressed");
    }

    private void Connect()
    {
        IPHostEntry iPHost = Dns.GetHostEntry(_serverHost);
        IPAddress iPAddress = iPHost.AddressList[0];
        IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, _serverPort);
        _serverSocket = new Socket(iPAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        _serverSocket.Connect(iPEndPoint);

    }

    private void btnPress_Click(object sender, EventArgs e)
    {
        SwitchPlayer();
    }
}

Я хочу чтобы я создавал два клиента и от сервера посылал им значение true or false, чтобы в работала всегда только одна форма, то есть только один клиент, а они у меня активны постоянно оба, ну или хотя бы кнопка на форме была активна лишь на одной форме, то есть нажал я кнопку на форме 1, она enabled = false, но на второй форме она true, нажал на второй, то на второй она enabled = false, а на первой включилась, мне для этого, как я понимаю, нужно как-то с сервера отправлять сообщение типа "1 форма" или "white" я им дал название, а уже в клиенте проверять, если с сервера пришло white, то кнопка true, если black - false для этой формы, а для другой наоборот, в общем просто хочу сделать такой переключатель, на одном клиенте нажал ,там кнопка не активна стала, на другом нажал, то на первом она активировалась, а ту что нажал теперь деактивирована. Никак не разберусь с этим, вроде понимаю как передать от сервера к клиенту и наоборот значения, а как обратиться к конкретному клиенту не пойму.


Ответы (0 шт):