繁体   English   中英

异步服务器套接字多个客户端

[英]Asynchronous server socket multiple clients

我一直在使用 msdn 上发布的以下代码:

http://msdn.microsoft.com/en-us/library/fx6588te.aspx

我了解在应用程序等待新客户端时服务器应用程序没有被阻止。

但是,这个应用程序(甚至套接字)可以处理多个并发请求吗?

  • 如果客户端 A 和 B 同时连接会发生什么?

  • 如果客户端 A 连接并且处理其请求需要 5 秒,如果客户端 B 稍后连接,它是否必须等待客户端 A 完成才能开始处理?

  • 还是会同时处理客户端 A 和客户端 B 的请求?

我通过在套接字侦听器代码中的接收/发送数据之间放置 Thread.Sleep(n) 命令对此进行了一些测试。 然后我可以向套接字发送多个请求,它们似乎已被处理。 然而,套接字总是在同一个线程 id 上处理它们——这让我相信它实际上并没有同时发生。

特别是考虑到微软的描述,这个应用程序在等待新连接时根本不会阻塞——这是否意味着它可以处理并发连接?

[2014 年更新]:自发布此答案以来,该示例似乎已被修改,如该线程中所述。 MSDN 示例现在可以正确处理多个传入连接。 无论如何,这里描述的一般方法是正确的,也许它可以提供额外的说明。


在进行套接字通信时,基本上所有传入连接都有一个侦听器套接字,每个连接的客户端都有多个处理程序sockets。

监听传入连接

当您开始侦听端口时,您会为传入连接创建一个带有回调方法的套接字(这是引用您提到的示例)。 这是该端口号的唯一侦听器套接字

listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);

此行告诉侦听器在连接新客户端时调用AcceptCallback方法(新连接回调)。 该方法应该快速完成其工作,因为它会阻止其他传入连接。

创建专用处理程序 sockets

这也是为什么AcceptCallback必须立即使用自己的后台数据回调方法( ReadCallback )创建一个专用的“处理程序”套接字

// inside AcceptCallback, we switch to the handler socket for communication
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
    new AsyncCallback(ReadCallback), state); // fired on a background thread

从那一刻起,只要新连接的客户端收到一些数据,就会调用ReadCallback方法。

另外,在返回之前, AcceptCallback需要再次调用listener.BeginAccept ,以继续监听新的传入连接:

// this is the same server socket we opened previously, which will now 
// continue waiting for other client connections: it doesn't care about
// the actual data transmission between individual clients
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);

这部分在 MSDN 示例中被省略,意味着它只能接收一个连接。

接收数据

一旦从客户端获得数据包,就会调用ReadCallback方法。 所以,在这个数据回调方法中,你需要读取并处理接收到的数据,然后再次调用相同的BeginReceive方法(同样,使用ReadCallback作为它的数据回调方法)。

[编辑]

MSDN 示例的问题在于它只允许连接单个客户端( listener.BeginAccept仅调用一次)。 要允许多个并发连接,您需要使用handler.BeginReceive创建一个接收套接字,然后调用listener.BeginAccept开始监听新客户端。

每个套接字都会有一个与之关联的监听队列。 这将有待处理/部分接受的传入连接。 挂起连接的最大数量可以在listen() API 中以编程方式定义,在本例中只是“listener.Listen(100)”。 在这里设置为 100,套接字“侦听器”在侦听队列中可以有 150 (=2*100/2) 个挂起的连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM