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 для этой формы, а для другой наоборот, в общем просто хочу сделать такой переключатель, на одном клиенте нажал ,там кнопка не активна стала, на другом нажал, то на первом она активировалась, а ту что нажал теперь деактивирована. Никак не разберусь с этим, вроде понимаю как передать от сервера к клиенту и наоборот значения, а как обратиться к конкретному клиенту не пойму.