Rem*_*tec 13 .net c# sockets tcp client-server
我一直在使用msdn上发布的以下代码:
http://msdn.microsoft.com/en-us/library/fx6588te.aspx
我知道在应用程序等待新客户端时,服务器应用程序未被阻止.
但是,这个应用程序(甚至套接字)可以处理多个并发请求吗?
如果客户端A和B同时连接会发生什么?
如果客户端A连接并且其请求的处理需要5秒钟,如果客户端B连接了一秒钟后,它必须等待客户端A完成才能开始处理吗?
或者客户A和客户B的请求是否会同时处理?
我已经通过在套接字侦听器代码中的接收/发送数据之间放置Thread.Sleep(n)命令来完成一些测试.然后,我可以向套接字发送多个请求,它们似乎已被处理.但是套接字总是在同一个线程id 上处理它们- 这让我相信它实际上并不是同时发生的.
特别是微软的描述,这个应用程序在等待新连接时根本没有阻止 - 这是否意味着它可以处理并发连接?
Gro*_*roo 31
[更新2014]:似乎该示例已被修改,因为此答案已发布,如此主题中所述.MSDN示例现在可以正确处理多个传入连接.无论如何,这里描述的一般方法是正确的,也许它可以提供额外的澄清.
在进行套接字通信时,基本上所有传入连接都有一个侦听器套接字,每个连接的客户端都有多个处理程序套接字.
当您开始侦听端口时,您创建一个套接字,其中包含传入连接的回调方法(这是引用您提到的示例).这是该端口号的唯一侦听器套接字:
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
Run Code Online (Sandbox Code Playgroud)
该行告诉侦听器在AcceptCallback连接新客户端时调用该方法(新连接回调).该方法应该快速完成其工作,因为它阻止其他传入连接.
这也是为什么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
Run Code Online (Sandbox Code Playgroud)
从那一刻开始,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);
Run Code Online (Sandbox Code Playgroud)
MSDN示例中省略了此部分,这意味着它只能接收单个连接.
一旦从客户端获得数据包,ReadCallback就会调用方法.因此,在此数据回调方法中,您需要读取并处理接收到的数据,然后再次调用相同的BeginReceive方法(同样,使用其数据回调方法).ReadCallback
[编辑]
MSDN示例的问题在于它只允许连接单个客户端(listener.BeginAccept仅调用一次).要允许多个并发连接,您需要使用创建接收套接字handler.BeginReceive,然后调用listener.BeginAccept以开始侦听新客户端.
| 归档时间: |
|
| 查看次数: |
31932 次 |
| 最近记录: |