在MSDN 杂志 2005 年 8 月的这篇文章中,Daryn Kiely 解释了构建 TCP 服务器的三种方法。
第三种模型,异步模型,是最适合我需要的模型,但我对其内部工作的一些细节有一些了解。
问题 1 - 关于接受连接的线程数
在示例中,当通过调用启动服务器时Start()
,代码会创建十个接受连接的线程池:
public void Start()
{
SetupServerSocket();
for (int i = 0; i < 10; i++)
_serverSocket.BeginAccept(AsyncCallback(AcceptCallback), _serverSocket);
}
我不明白为什么你不能只使用一个_serverSocket.BeginAccept
,为什么数字十。
问题 2 – 大约收到零字节
在ReceiveCallback()
中,如果我们收到零字节,我们将关闭连接。为什么?当接收到零字节时总是认为客户端关闭了连接?在我在这里进行的测试中,当我的客户端关闭连接时,我得到一个在 SocketException 中捕获的异常。我在这里错过了什么吗?
问题 3 – 关于重新开始接收的需要
在套接字中接收到某些内容后,它会被放回 BeginReceive。为什么我们需要重新开始接收?这不应该是自动的吗?
问题 4 – 关于缓冲区大小
使用 255 字节的缓冲区。我知道如果一条消息的长度大于缓冲区大小,它会在多个接收中分散。我应该设置一个足够大的缓冲区大小以保证没有消息会被碎片化,还是我必须提供代码来处理消息碎片(在一个缓冲区中加入多个接收)?