回答你问题的另一半:
关于异步TCP套接字的任何其他建议也欢迎
简单来说,我不会像你原始帖子中所示的那样进行管理。相反,应该从System.Net.Sockets.TcpClient和System.Net.Sockets.TcpListener类中寻求帮助。使用BeginAcceptSocket(...)和BeginRead(...)等异步调用,并允许线程池完成其工作。这种方式真的很容易组合在一起。
你应该能够实现所有所需的服务器行为,而无需编写可怕的“new Thread”代码 :)
这里是一个基本的示例,不包括优雅关闭、异常处理等内容:
public static void Main()
{
TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, 8080));
listener.Start();
listener.BeginAcceptTcpClient(OnConnect, listener);
Console.WriteLine("Press any key to quit...");
Console.ReadKey();
}
static void OnConnect(IAsyncResult ar)
{
TcpListener listener = (TcpListener)ar.AsyncState;
new TcpReader(listener.EndAcceptTcpClient(ar));
listener.BeginAcceptTcpClient(OnConnect, listener);
}
class TcpReader
{
string respose = "HTTP 1.1 200\r\nContent-Length:12\r\n\r\nHello World!";
TcpClient client;
NetworkStream socket;
byte[] buffer;
public TcpReader(TcpClient client)
{
this.client = client;
socket = client.GetStream();
buffer = new byte[1024];
socket.BeginRead(buffer, 0, 1024, OnRead, socket);
}
void OnRead(IAsyncResult ar)
{
int nBytes = socket.EndRead(ar);
if (nBytes > 0)
{
socket.BeginWrite(
Encoding.ASCII.GetBytes(respose), 0, respose.Length, null, null);
socket.BeginRead(buffer, 0, 1024, OnRead, socket);
}
else
socket.Close();
}
}
如果想要了解更复杂的实现方法,可以参考我一段时间前编写的SslTunnel Library。