異步 Socket 核心流程:BeginConnect → OnConnect → BeginReceive → OnReceivedData → 再次 BeginReceive 形成接收循環。本文詳細解析兩個回調方法的實現細節。
public void OnConnect(IAsyncResult ar)
{
Socket sock = (Socket)ar.AsyncState;
try
{
sock.EndConnect(ar);
if (sock.Connected)
{
AsyncCallback receiveCB = new AsyncCallback(OnReceivedData);
sock.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, receiveCB, sock);
}
else
{
Console.WriteLine("連接失敗");
}
}
catch (Exception ex)
{
Console.WriteLine("連接異常: " + ex.Message);
}
}
public void OnReceivedData(IAsyncResult ar)
{
Socket sock = (Socket)ar.AsyncState;
try
{
int bytesRead = sock.EndReceive(ar);
if (bytesRead > 0)
{
string msg = Encoding.ASCII.GetString(buffer, 0, bytesRead);
ParseMessage(sock, msg); // 業務解析
SetupReceiveCallback(sock); // 重新掛接接收
}
else
{
// 對端關閉
sock.Shutdown(SocketShutdown.Both);
sock.Close();
}
}
catch (Exception ex)
{
Console.WriteLine("接收異常: " + ex.Message);
}
}
void SetupReceiveCallback(Socket sock)
{
sock.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceivedData), sock);
}

主線程完全不阻塞,所有網絡 I/O 由線程池完成端口(IOCP)驅動,適合高併發場景。
示例中每個節點同時作為 Client 與 Server,可在此基礎上實現節點發現、NAT 穿透、消息路由等 P2P 功能。