Если я правильно прочитал, вы хотите способ обработки / хранения нескольких клиентов? Если это так, то вот что я сделал в моем проекте (в основном сервер с большим количеством клиентов)
внутри сервера я запускаю поток, делающий это:
private static void WaitForConnection()
{
try
{
TcpClient client = listener.AcceptTcpClient();
Log("Client Connected!");
Thread clienThread = new Thread(delegate () { ClientThread(client); });
clienThread.IsBackground = true;
clienThread.Start();
WaitForConnection();
}
catch (Exception e)
{
Log(string.Format("ERROR at WaitForConnection: {0}", e.Message));
WaitForConnection();
}
}
ClientThread:
public static void ClientThread(TcpClient client)
{
int clientID = nextTCPClientID;
nextTCPClientID++;
dicTCPclients.Add(clientID, client);
dicNetworkstreams.Add(ns, clientID);
dicClientIDToNetworkstreams.Add(clientID, ns);
// do more stuff here ...
}
На моем сервере есть несколько словарей, в которых хранится целое число, представляющее clientID и TCPClient / NetworkStream.
Если вы хотите отправить что-то всем клиентам, вы можете использовать что-то вроде этого
foreach (NetworkStream ns in dicNetworkstreams.Keys)
{
//Send here
byte[] lengthBuffer = BitConverter.GetBytes(data.Length);
ns.Write(lengthBuffer, 0, lengthBuffer.Length);
ns.Write(data, 0, data.Length);
}
Также, прочитав ваш вопрос еще раз, попробуйте вызвать метод для вашего AcceptTcpClient()
, аналогично тому, что я использовал (WaitForConnection()
). Это может решить проблему с дубликатами.