要編寫高性能的Socket服務器,為每個接收的Socket分配獨立的處理線程的做法是不可取的,當連接數量很龐大時,服務器根本無法應付。要響應龐大的連接數量,需要使用IOCP(完成端口)來撤換並處理響應。
.net framework的System.Net.Sockets.Socket 類有一組xxxAsync方法是封裝了IOCP的處理,用於編寫高性能Socket應用程序,xxxAsync該組方法需要結合SocketAsyncEventArgs類來使用,下面是MSDN參考資料,里面有一個詳細的例子:
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx
Socket類xxxAsync的方法,使用起來比較復雜,需要時間消化上述的例子,結合實際編寫所需的操作。
web服務器編程過程中。需要使用異步技術。使用異步的地方:
1、監聽socket,需要等待客戶端接入。這是需要一個線程專門負責監聽(accept方法)
2、一旦客戶端連接,通信socket需要線程監聽緩沖區,以便與客戶端通信。包括接收和發送。
寫些自己的理解。
1、利用socket類中提供的異步方法:AcceptAsync。創建監聽方法
這個方法需要在回調函數中重復調用,以保證監聽。
private void StartAccept(SocketAsyncEventArgs acceptEventArg)
{
if (acceptEventArg == null) //初始化用
{
acceptEventArg = new SocketAsyncEventArgs();
acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted); //回調函數 實例化
}
else //循環調用時 需要清理對象。將AcceptSocket屬性設置為null。等待新連接的接入
{
acceptEventArg.AcceptSocket = null;
}
bool bl = this.listenSocket.AcceptAsync(acceptEventArg); //該異步方法 每次只能接收一個連接。需要循環調用
if (!bl)
{
this.ProcessAccept(acceptEventArg);
}
}
回調函數(有格式哦)這個e變量包含了好多的東東哦。
private void OnAcceptCompleted(object sender, SocketAsyncEventArgs e)
{
Console.WriteLine("有一個客戶端連接上來了");
StartAccept(e); //非常重要,循環調用該方法。實現監聽
}
2、在回調函數中。利用socket類提供的異步方法:ReceiveAsync和SendAsync。異步接收和發送數據
