2012-03-27 178 views
0

我有一台服务器发送数据的速度尽可能快,它可以产生它并通过套接字发送数据。服务器使用一个队列,并有一个生产者线程和一个消费者线程,将生成的数据从套接字发送到客户端。处理流媒体服务器

问题是读取客户端的数据。我如何设计一个客户端来处理数据,而不会失去同步? 如果我发送从客户端到服务器的确认,我在服务器端失去了并发速度。我如何编写/设计客户端以足够快地处理传入数据? 我是否需要在客户端实现队列?

回答

1

除非你有一个要求你必须使用TCP以外的东西,否则让TCP为你做流量控制的工作。让客户端以尽可能快的速度使用数据,服务器在发送更多数据之后将阻塞,而不是客户端准备使用并填充TCP窗口。

TCP将永远不会同步,因为套接字上的数据将始终按顺序传递。但是服务器肯定会发送比客户端消耗的更多的数据,所以它可能已经转移到发送下一批数据,而客户端仍在使用前一个数据。这是你的意思不同步?

您不想让客户端在服务器启动下一个任务之前发送确认,因为这会花费RTT(往返时间,即一批数据中最后一批到达客户端和确认回去),这将在高延迟链路上减慢协议。

如果你不想要这个RTT价格,你不可避免地会具有成实现:

  • 客户端同时请求多个批次。您可以使用像IMAP这样的标记协议:客户端一次在一个套接字上提交多个作业,每个套接字都有自己的标记。服务器响应每个请求,并在每个响应的头部中添加标签,以便客户端知道哪个响应会随着哪个请求发送。当客户看到“足够”的回应时,它会提交更多请求。客户端可以控制同时有多少个请求正在进行。如果客户端一次只允许一个,则这会退化为简单的具有RTT成本的ACK情况。
  • 让服务器在客户端前工作一点,在客户端确认第一个响应之前向客户端发送几个响应。在管道被填充到服务器愿意允许的最大数量未确认的作业之后,它等待确认并为从客户端收到的每个确认发送一个额外的作业响应。如果服务器只允许一个未完成的工作,则退化为如上所述的简单ACK情况。如果服务器一次允许太多未确认的作业,则这会退化为填充TCP的缓冲区并依靠TCP流控制来阻止服务器,直到客户机准备好接受更多数据。
+0

那么我发送的数据是用一个头来构造的。这取决于我如何构建数据。我遇到的问题是解析数据,因为数据移动速度过快而与服务器不同步。 – 2012-03-27 17:31:38

+0

你还没有说过你是否会使用TCP。如果你使用TCP,为什么它会不同步?如果你不这样做,为什么不呢? – Celada 2012-03-27 19:04:28

+0

我正在使用TCP。它不同步,因为服务器在客户端处理完前一组数据之前发送下一组数据。我可以让客户端在两者之间发送确认,但是我失去了并发服务器的好处。我正在尝试为音频/视频制作流媒体服务器和客户端。 – 2012-03-27 20:10:42