gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:30:13 25 4
gpt4 key购买 nike

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

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

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

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

  • 如果客户端 A 和 B 同时连接会怎样?

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

  • 或者客户端A和客户端B的请求会同时处理吗?

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

特别是根据微软的描述,该应用在等待新连接时不会阻塞 - 这是否意味着它可以处理并发连接?

最佳答案

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


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

监听传入连接

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

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

此行告诉监听器在连接新客户端时调用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

从那一刻起,每当新连接的客户端收到一些数据时,就会调用 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 开始监听新客户端。

关于c# - 异步服务器套接字多个客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5815872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com