2012-11-07 85 views
3

我正在做一个应用程序在C#中,与一个服务器和一些客户端(不超过60),我希望能够独立处理每个客户端。服务器和客户端之间的通信很简单,但我不得不等待一些问题,我不想阻止任何查询。一个服务器很多客户端:线程或类

到目前为止,我已经做了服务器端的两个版本,一个它是基于这样的:

http://aviadezra.blogspot.com.es/2008/07/code-sample-net-sockets-multiple.html

,并在另外一个,我基本上为每一个客户端一个新的线程。两个版本都能正常工作......但我想知道两种方法的优缺点。

在这种情况下需要遵循的编程模式是什么?

+1

线程每客户端是实现这一点的直接方式,并不应该真正造成与少数客户端的问题。只要确保正确地同步对共享数据的访问。 (在同步非阻塞客户端中,这可能会更容易,代价是使网络代码更复杂。) – millimoose

+5

如果你在.Net中这样做,你是否有充分的理由直接使用套接字而不是使用某种东西更像抽象它像WCF的异步?如果使用正确的传输方式,也可以使用双向绑定。有关信息,请参阅http://blog.vuscode.com/malovicn/archive/2012/01/21/what-is-new-in-wcf-in-net-4-5-taskt-and-async.aspx。 –

+0

谢谢大家! @PeterLaCombJr。,我使用套接字只是因为我在过去完成了同样的协议,但只有一个客户端......除此之外,我从来没有使用过WCF。无论如何,我也会尝试一下,只是为了看看它们的区别。(不幸的是,使用.NET 4.0) – iluvatar

回答

1

要回答你的问题,它是两个。你有线程和类在这些线程中运行。无论你使用WCF,异步,套接字还是其他任何东西,你都会在一个线程中运行一些对象(或者像使用异步一样在线程池周围进行混洗)。使用WCF你可以c onfigure the concurrency model,如果你必须等待确认或其他确认,你最好将它设置为多个线程,这样你就不会阻止其他请求。

在本示例中,链接到作者的示例使用AsyncCallback作为告诉你套接字有数据的机制。但是,从MSDN你可以看到:

在一个单独的线程

使用一个AsyncCallback委托来处理异步操作的结果,所以它是真正适用于小规模的应用程序没有什么不同。像这样使用异步可以帮助你避免为每个线程分配堆栈空间,如果你要做一个大型应用程序,这很重要。但对于一个小应用程序,我认为这只会增加复杂性。 C#4.5+和F#在异步方面做得更干净,所以如果你可以使用类似的东西,那么也许会去做。

这样做,你有一个单一的线程负责套接字管理。它会坐下来接受新的联系。当它收到请求时,它将该套接字交给一个新的专用线程,然后该线程将坐在该套接字上并从中读取。这个线程是你的客户端连接。我喜欢将套接字客户端读取封装到可以完成所需的低级别io的基类中,然后充当请求的路由器。即当我得到请求XYZ时,我会请求ABC。你甚至可以派遣事件并订阅其他地方的事件(例如在异步示例中)。现在,您已将您的客户端逻辑从您的套接字读取逻辑中分离出来。

如果你使用WCF做事,你不需要套接字和所有额外的处理,但是你仍然应该知道调用是多线程的并且在适用的时候正确地同步你的应用程序。

对于60位客户,我认为您应该选择最适合您的任何作品。 WCF很容易设置,易于使用,我会使用它,但套接字也很好。如果您担心正在运行的线程数量,请不要这样做。虽然线程运行太多是不好的,但是大部分线程实际上在等待IO时被阻塞。处于等待状态的线程不由操作系统调度,并且无关紧要。更何况等待最有可能是在引擎盖下使用io完成端口,所以对于像你这样的小应用来说,等待开销几乎可以忽略不计。最后,我会选择最简单的方式来编写,维护和扩展。

+1

感谢您的时间和您的回答!我终于用套接字完成了它,并且它运行良好(我在11月完成了它)。无论如何,下次我只会使用WCF来学习它。 – iluvatar