首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

打造簡易多線程即時通訊程式:類 QQ/MSN 的 TCP 實作指南

     編輯:關於C#

想自行開發一個像 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});

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved