c# - 一台服务器许多客户端 : Threads or classes

标签 c# .net sockets

我正在用 C# 开发一个应用程序,其中有一个服务器和一些客户端(不超过 60 个),我希望能够独立处理每个客户端。服务器和客户端之间的通信很简单,但我必须等待一些确认,我不想阻止任何查询。

到目前为止,我已经完成了两个版本的服务器端,一个是基于此:

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

而在另一个中,我基本上为每个客户创建了一个新线程。两个版本都可以正常工作...但我想知道这两种方法的优缺点。

在这种情况下有什么编程模式可以遵循吗?

最佳答案

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

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

Use an AsyncCallback delegate to process the results of an asynchronous operation in a separate thread

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

按照您的方式进行操作,您有一个线程负责套接字管理。它会坐下来接受新的连接。当它收到请求时,它将那个套接字交给一个新的专用线程,然后该线程将驻留在该套接字上并从中读取。该线程是您的客户端连接。我喜欢将套接字客户端读取封装到一个基类中,该基类可以执行所需的低级别 io,然后充当请求的路由器。 IE。当我收到请求 XYZ 时,我会请求 ABC。您甚至可以让它分派(dispatch)事件并在其他地方订阅这些事件(如在异步示例中)。现在您已经将客户端逻辑与套接字读取逻辑分离。

如果您使用 WCF 执行操作,则不需要套接字和所有额外处理,但您仍应注意调用是多线程的,并在适用时正确同步您的应用程序。

对于 60 位客户,我认为您应该选择最适合您的。 WCF 易于设置和使用,我会使用它,但套接字也很好。如果您担心运行的线程数,请不要担心。虽然运行太多线程是不好的,但大多数线程在等待 IO 时实际上会被阻塞。处于等待状态的线程不是由操作系统调度的,因此并不重要。更不用说等待很可能是在引擎盖下使用 io 完成端口,因此等待开销对于像您这样的小型应用程序来说几乎可以忽略不计。

最后,我会选择最容易编写、维护和扩展的内容。

关于c# - 一台服务器许多客户端 : Threads or classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13261625/

相关文章:

c# - 在 Xamarin 的 View 中将 ViewModel 属性与 ListView 绑定(bind)

java - Netty 4 中的阻塞

java - 在 Internet 上部署 Java 聊天服务器(套接字)

c# - MAC : Mono Helloworld example

c# - 添加项目时在 ConcurrentDictionary<TKey, TValue> 上调用 ToList()

c# - 对于 C# 无法使用类型约束推断泛型类型参数,是否有解决方法?

C# 将字符串元素数组传递给 Task.Run

sockets - 我可以使用 Lua "socket"库找出端口的状态吗?

c# - 如何避免 asp :Multiview to load all the views

c# - iTunes SDK : Loading shared music