TCP聊天:服务器发送到多个客户端

时间:2018-04-10 12:47:01

标签: c# tcp chat tcpclient tcplistener

所以我正在使用TCP协议进行C#聊天,我无法弄清楚如何让服务器将客户端收到的数据发送给连接到他的所有客户端。所以我试图将所有客户端放入arraylist并使用“foreach”发送服务器like in this topic收到的数据,但我失败了。 对于发送和接收数据,我使用的是Streams(StreamWriter / StreamReader)。每个客户端都由服务器在不同的线程中处理。

问题:如何同时向所有客户端发送数据?

服务器:

static void LoopClients()
{
    while (running)
    {
        TcpClient newClient = server.AcceptTcpClient();
        arrClient.add(newClient)

        Console.WriteLine("Connection accepted from " + ((IPEndPoint)newClient.Client.RemoteEndPoint).Address);

        Thread t = new Thread(new ParameterizedThreadStart(HandleClient));
        t.Start(newClient);
    }
}

static void HandleClient(object obj)
{
    TcpClient client = (TcpClient)obj;

    StreamWriter Writer = new StreamWriter(client.GetStream(), Encoding.ASCII);
    StreamReader Reader = new StreamReader(client.GetStream(), Encoding.ASCII);

    Boolean ClientConnected = true;
    String Data = null;
    var LEP = client.Client.RemoteEndPoint as IPEndPoint;
    var LAD = LEP.Address;


    while (ClientConnected)
    {
        Data = Reader.ReadLine();

        Console.WriteLine(""+ LAD + " : " + Data);

        Writer.WriteLine(LAD+" : "+Data+"");
        Writer.Flush();
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

基本上,您需要以某种方式跟踪所有客户端。此可以跟踪同步集合中的所有StreamWriter一样简单,并确保在会话终止时从中删除它。例如:

StreamWriter Writer = new StreamWriter(client.GetStream(), Encoding.ASCII);
try {
    lock(allClients) { allClients.Add(Writer); }
    while (ClientConnected)
    {
        ...
    }
} finally {
    lock(allClients) { allClients.Remove(Writer); }
}

现在,当我们想要向所有人发送消息时,我们需要做一些事情。也许最简单的事情是同步扫描:

lock(allClients) {
    foreach(var writer in allClients)
        try { writer.Send(message); } catch { /* log */ }
}

这会同步整个集合 - 只要这是发送消息的唯一位置,那么您就知道:您永远不会尝试两次发送到同一个套接字一次,和b:你不会通过添加/删除套接字来破坏迭代器。

警告:这是一个非常粗略和基本的多客户端服务器实现,应该只用作该主题的介绍。 "真"多客户端服务器应该 更偏执于此。