【问题标题】:send a file to multiple clients using TCP socket使用 TCP 套接字将文件发送到多个客户端
【发布时间】:2013-01-07 20:18:58
【问题描述】:

我正在开发一个 Web 应用程序,它等待 N(例如,大约 5 个)用户通过 TCP 套接字连接到 Web 服务。服务器跟踪连接的套接字数量,一旦达到 N,他就会同时向所有套接字发送一个(单个)文件,比如最大 2MB。这里的重点是时间安排——他们都应该同时接收文件,而不是一个接一个。

作为 c# 和套接字编程的新手,我想知道在这种情况下最好的方法是什么? 我想到了以下几点: 服务器(异步)接收套接字连接,一旦达到 N,循环遍历文件中的所有字节,并且在每次迭代中向每个连接的客户端发送一个 Kbyte(或者可能更少?) - 这在我的意见,是最接近同时发送文件的方法。

我对如何实现这一点有点困惑。 任何帮助都会很棒。 谢谢

编辑: 通过同时接收,我的意思是,从技术上讲,我不希望服务器将文件发送到第一个客户端,然后发送到第二个客户端,然后发送到第三个客户端,等等,而是一次将其发送给所有客户端它在服务器之外,它不在我的手中!假设没有网络问题,并且客户端都非常接近(物理上),他们应该或多或少地同时接收文件。 也许解决方案比我想象的要简单......

【问题讨论】:

  • 我认为您正在寻找多播。
  • 不,可能不会。多播有严格的基础设施要求,不能在互联网上工作。在公司网络上,除非您使用 ICMP,否则它会淹没网络。我非常喜欢它,但是基于此信息推荐多播是严重的忽视,并且边界对网络一无所知。这可能适用于非多播基础设施(大多数公司和互联网一样)。
  • “他们都应该同时接收文件” - 您正在考虑发送数据块,但您能否详细解释一下您认为“同时接收文件”是什么?也许是一些上下文信息。
  • 所以如果其中一个客户端没有收到一些数据,无论是因为速度慢还是因为它是恶意的,你想延迟数据到其他客户端吗?你对客户有控制权吗?他们可以实现确认协议吗? (您关于以小块发送的想法毫无意义,也行不通。它只会让性能变差,因为您将缓慢地填充自己的发送缓冲区并导致分段延迟。)
  • @C.Evenhuis,@David Schwarz,同时接收我的意思是,从技术上讲,我不希望服务器将文件发送到第一个客户端,然后发送到第二个客户端,然后到第三个等等,而是一次发送给他们所有人,一旦它离开服务器,它就不在我的手中!假设没有网络问题,文件应该大致同时到达所有这些!

标签: c# .net sockets filestream


【解决方案1】:

您已经计划异步接受套接字连接,并且由于回调发生在单独的线程上,您可以简单地有一个异步回调:

  • 接受传入的套接字连接
  • 再次调用 BeginAccept()(在监听套接字上)
  • 发送文件
  • 关闭(先前接受的套接字的)连接

如果多个客户端同时连接,这将导致多个线程同时发送文件,并且几乎同时发送。

您的文件可能会同时被多个线程访问,因此您必须例如使用FileShare.Read 打开它。

希望这会有所帮助,我忽略了“N 个同时客户端”,因为我知道这并不是真正的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2012-05-21
    • 2014-12-01
    • 1970-01-01
    • 2018-05-16
    • 2018-09-24
    相关资源
    最近更新 更多