想自行開發一個像 QQ 或 MSN 這樣的即時通訊工具嗎?本文將帶你從零開始,使用 C# 和 TCP 協定,實作一個支援私聊、群聊(會議)功能的多線程 Client/Server 架構即時通訊應用程式。
首先定義一個共用的 ChatLibrary,包含通訊協定命令與訊息結構。命令列舉 Command 定義了登入、私訊、客戶端列表、會議、登出等動作:
public enum Command
{
Login = 0,
PersonalMessage = 1,
ClientList = 2,
Conference = 3,
Logout = 4
};
Message 類別封裝了發送者、接收者、命令類型與訊息內容,並提供序列化/反序列化方法,採用「|」分隔欄位的簡易協定格式:
public class Message
{
string strSender;
string strReceiver;
Command cmdMessageCommand;
string strMessageDetail;
public Message(byte[] rawMessage)
{
string strRawStringMessage = System.Text.Encoding.ASCII.GetString(rawMessage);
string[] strRawStringMessageArray = strRawStringMessage.Split(new char[]{'|'});
this.strSender = strRawStringMessageArray[1];
this.strReceiver = strRawStringMessageArray[2];
this.cmdMessageCommand = (Command)Convert.ToInt32(strRawStringMessageArray[3]);
this.MessageDetail = strRawStringMessageArray[4];
}
public byte[] GetRawMessage()
{
System.Text.StringBuilder sbMessage = new System.Text.StringBuilder("John");
sbMessage.Append("|");
sbMessage.Append(strSender);
sbMessage.Append("|");
sbMessage.Append(strReceiver);
sbMessage.Append("|");
sbMessage.Append((int)cmdMessageCommand);
sbMessage.Append("|");
sbMessage.Append(strMessageDetail);
sbMessage.Append("|");
return System.Text.Encoding.ASCII.GetBytes(sbMessage.ToString());
}
// ... 其他屬性與方法
}
伺服器使用 TcpListener 監聽指定 IP 與連接埠,並啟動專門執行緒等待用戶端連線:
IPEndPoint endPoint = new IPEndPoint(ipaAddress, iPort);
listener = new TcpListener(endPoint);
listener.Start();
thrListenForClients = new Thread(new ThreadStart(ListenForClients));
thrListenForClients.Start();
當有新連線時,建立 Client 物件封裝 TcpClient,並以非同步委派開始接收訊息:
Client acceptClient = new Client();
acceptClient.Socket = listener.AcceptTcpClient();
listenForMessageDelegate = new ListenForMessageDelegate(ListenForMessages);
listenForMessageDelegate.BeginInvoke(acceptClient, new AsyncCallback(ListenForMessagesCallback), "Completed");
Client 類別提供 SendMessage 方法,透過 NetworkStream 傳送序列化後的訊息位元組陣列。
接收到資料後,解析為 Message 物件,並觸發對應事件(ClientConnected、ClientDisconnecting、MessageReceived),讓上層 UI 輕鬆處理顯示邏輯:
public event ClientConnectedEventHandler ClientConnected;
public event ClientDisconnectingEventHandler ClientDisconnecting;
public event MessageReceivedEventHandler MessageReceived;
客戶端同樣建立 TcpClient 連線至伺服器,並啟動執行緒循環讀取 NetworkStream。UI 採用兩個 Form:MessengerForm 負責連線管理與訊息接收,ClientWindow 負責顯示聊天內容。跨執行緒更新 UI 時使用 Invoke:
this.Invoke(createNewClientDelegate, new object[]{receivedMessage});

這個範例展示了即時通訊的核心骨架,你可以在此基礎上擴充好友清單、離線訊息、檔案傳輸等進階功能。