为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
缥缈止盈 2021-04-02 08:26:31
所以我正在使用TCP协议进行C#聊天,我想不通如何使服务器将客户端接收到的数据发送给与之连接的所有客户端。因此,我尝试将所有客户端放入一个arraylist中,并使用“ foreach”向其发送服务器接收的数据(如本主题中所述),但失败了。为了发送和接收数据,我使用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 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

本质上,您需要以某种方式跟踪所有客户端。这可以像跟踪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 */ }

}

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


注意:这是多客户端服务器的非常原始的基本实现,实际上应该仅用作本主题的介绍。“真正的”多客户端的服务器应该是多少更偏执地认为这一点。


查看完整回答
反对 回复 2021-04-10
  • 1 回答
  • 0 关注
  • 306 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信