【问题标题】:Multithread message send on TCP server在 TCP 服务器上发送多线程消息
【发布时间】:2021-02-28 12:41:10
【问题描述】:

我需要广播使用TcpClient 连接到服务器的客户端。目前,我有一个 for 遍历整个客户列表,他们会一一收到消息。但是消息之间有一段时间,所以客户端不会同时收到消息。我认为使用多线程或协同程序有效,有人可以建议我吗?我附上广播的功能代码

谢谢大家

public void broadCast(string sendMsg)
{
    foreach (User user in clientList)
    {
        if (user.tcpClient != null)
        {
            m_NetStream = user.tcpClient.GetStream();

            if (m_NetStream != null)
            {
                byte[] msgOut = Encoding.ASCII.GetBytes(sendMsg);
                m_NetStream.Write(msgOut, 0, msgOut.Length);
            }
            else
            {
                ServerLog("Socket Error: Start at least one client first", Color.red);
                return;
            }
        }
    }
}

【问题讨论】:

    标签: c# unity3d tcpclient


    【解决方案1】:

    如果您想同时发送给多个客户端,我建议使用WriteAsync 变体。我还建议按照 cmets 中的建议,移动创建缓冲区以将其发送到循环之外。

    目前,在发送所有消息之前,您不会从broadCast 返回,我在下面将其实现为WaitAll,但可以跳过此方法或将此方法设为async,如果还有更多合适。

    public void broadCast(string sendMsg)
    {
        var pendingSends = new List<Task>();
        byte[] msgOut = Encoding.ASCII.GetBytes(sendMsg);
        foreach (User user in clientList)
        {
            if (user.tcpClient != null)
            {
                m_NetStream = user.tcpClient.GetStream();
    
                if (m_NetStream != null)
                {
    
                    pendingSends.Add(m_NetStream.WriteAsync(msgOut, 0, msgOut.Length));
                }
                else
                {
                    ServerLog("Socket Error: Start at least one client first", Color.red);
                }
            }
        }
        Task.WaitAll(pendingSends.ToArray());
    }
    

    (旁注,不确定错误记录是否在正确的位置。我原以为它会在 clientList 为空时触发)

    请注意,我在这里没有做任何涉及线程的事情 - 这个任务似乎天生就受 I/O 限制,受我们通过网络发送数据的速度限制。引入更多线程不会改变这一点。

    最后,我从 cmets 重复一遍:

    请注意,TCP 是无尽的字节流,而不是消息。我没有看到您做任何事情来帮助接收者确定您的消息的范围(例如,首先发送长度、分隔符或其他消息框架技术)

    【讨论】:

      猜你喜欢
      • 2017-11-02
      • 2019-12-06
      • 2013-04-29
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多