如何从TCP侦听器

时间:2016-10-05 13:37:52

标签: c# .net tcpclient tcplistener

我正在使用TcpListener(Clase)示例https://msdn.microsoft.com/es-es/library/system.net.sockets.tcplistener(v=vs.110).aspx来处理TCP请求。

但似乎同时这个TCP Listener会接受多个请求,这些请求应该稍后在几个Web Services中处理,并且结果必须返回到TCP client

我想做以下事情:

  1. 获取用于读取和写入NetworkStream stream = client.GetStream();的流对象,并将其保存在特殊的容器类中。

  2. 将此类放入特殊Queue辅助类,如此C#: Triggering an Event when an object is added to a Queue

  3. 更改Queue时,触发实现事件以使用Task异步处理下一个队列项。

  4. Task内与Web Services进行沟通,并将回复发送至TCP Client

  5. 请告诉我这个架构至关重要,能够解决对TCP Listener的多个请求。

2 个答案:

答案 0 :(得分:2)

我建议你使用netmq。看看https://github.com/zeromq/netmq

答案 1 :(得分:1)

使用队列绝对是可行的想法,但要考虑它的用途。它限制了您可以并行处理的请求数量。在某些情况下,您可能需要限制它,最常见的是每个请求处理执行CPU绑定的工作(繁重的计算)。那么你并行处理大量数据的能力是有限的,你可以使用队列方法。

在您的请求中,处理执行IO绑定工作(等待Web请求完成)。这不会消耗太多的服务器资源,并且您可以并行处理大量此类请求,因此在您的情况下很可能不需要队列。

即使您使用队列,一次只处理一个项目也很少有用。相反,处理具有X个线程的队列(其中X再次依赖于工作是CPU还是IO绑定,对于CPU,您可能没问题,X =核心数,IO需要更多)。如果您使用太少的线程来处理您的队列 - 您的客户端将基本上没有等待更多,甚至可能因超时而失败。