Comment faire pour utiliser le protocole TCP client/auditeur en multithread c#?

J'ai écrit ce code pour mon serveur:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
private static bool terminate;
public static bool Terminate
{
get { return terminate; }
}
private static int clientNumber = 0;
private static TcpListener tcpListener;
static void Main(string[] args)
{
StartServer();
Console.Read();
}
private static void StartServer()
{
try
{
Console.WriteLine("Server starting...");
tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);
terminate = false;
tcpListener.Start();
tcpListener.BeginAcceptTcpClient(ConnectionHandler, null);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally 
{
Console.WriteLine("Server stopping...");
terminate = true;
if (tcpListener != null)
{
tcpListener.Stop();
}
}
}
private static void ConnectionHandler(IAsyncResult result)
{
TcpClient client = null;
try
{
client = tcpListener.EndAcceptTcpClient(result);
}
catch (Exception)
{
return;
}
tcpListener.BeginAcceptTcpClient(ConnectionHandler, null);
if (client!=null)
{
Interlocked.Increment(ref clientNumber);
string clientName = clientNumber.ToString();
new ClientHandler(client, clientName);
}
}
}
}
class ClientHandler
{
private TcpClient client;
private string ID;
internal ClientHandler(TcpClient client, string ID)
{
this.client = client;
this.ID = ID;
Thread thread = new Thread(ProcessConnection);
thread.IsBackground = true;
thread.Start();
}
private void ProcessConnection()
{
using (client)
{
using (BinaryReader reader=new BinaryReader(client.GetStream()))
{
if (reader.ReadString()==Responses.RequestConnect)
{
using (BinaryWriter writer=new BinaryWriter(client.GetStream()))
{
writer.Write(Responses.AcknowledgeOK);
Console.WriteLine("Client: "+ID);
string message = string.Empty;
while (message!=Responses.Disconnect)
{
try
{
message = reader.ReadString();
}
catch
{
continue;
}
if (message==Responses.RequestData)
{
writer.Write("Data Command Received");
}
else if (message==Responses.Disconnect)
{
Console.WriteLine("Client disconnected: "+ID);
}
else
{
Console.WriteLine("Unknown Command");
}
}
}
}
else
{
Console.WriteLine("Unable to connect client: "+ID);
}
}
}
}
}
class Responses
{
public const string AcknowledgeOK = "OK";
public const string AcknowledgeCancel = "Cancel";
public const string Disconnect = "Bye";
public const string RequestConnect = "Hello";
public const string RequestData = "Data";
}

ce code écouter les demandes des clients dans un environnement multi threaded. Je suis incapable de comprendre comment les distinguer entre les différents clients connectés à mon ce serveur et le client qui est de la déconnexion et de la demande pour les différentes commandes.

mon code client est:

private static void clietnRequest(string message,ref string response)
{
using (TcpClient client = new TcpClient())
{
if (!client.Connected)
{
client.Connect(IPAddress.Parse("127.0.0.1"), 8000);
using (NetworkStream networkStream = client.GetStream())
{
using (BinaryWriter writer = new BinaryWriter(networkStream))
{
writer.Write(Responses.RequestConnect);
using (BinaryReader reader = new BinaryReader(networkStream))
{
if (reader.ReadString() == Responses.AcknowledgeOK)
{
response = Responses.AcknowledgeOK;
}
}
}
}
}
}
}

ce morceau de code se connecte le client vers le serveur, mais je n'arrive pas à envoyer plus de messages. Je veux dans mon application si le client est connecté, il peut envoyer des commandes au serveur. au lieu de le faire à chaque fois un nouveau client vers le serveur. Il me manque quelque chose ici, de bien vouloir me guider dans la bonne direction. Je suis totalement novice en c# programmation réseau. De bien vouloir m'aider à améliorer mon code. D'écoute Tcp et le protocole Tcp Client est valide pour ce scénario, ou dois-je utiliser des Sockets?

Vous ne devriez pas tout avaler votre des exceptions avec un return vous n'avez aucune idée de si quelque chose allait mal, au moins les mettre dans une certaine forme de l'enregistrement.
ses juste pour la démo fin,
C'est encore une mauvaise habitude qui est bon pour briser tôt. Sur une note séparée, pourquoi êtes-vous à l'aide d'un ref au lieu de simplement en passant la réponse à la valeur de retour?
voir: stackoverflow.com/questions/5834755/...

OriginalL'auteur user1941098 | 2013-01-10