// 建立 TCP 監聽器
IPEndPoint endPoint = new IPEndPoint(ipaAddress, iPort);
listener = new TcpListener(endPoint);
listener.Start();
// 建立專責監聽執行緒
thrListenForClients = new Thread(new ThreadStart(ListenForClients));
thrListenForClients.Start();
Client acceptClient = new Client();
acceptClient.Socket = listener.AcceptTcpClient();
listenForMessageDelegate = new ListenForMessageDelegate(ListenForMessages);
listenForMessageDelegate.BeginInvoke(acceptClient, new AsyncCallback(ListenForMessagesCallback), "Completed");
使用委派 `BeginInvoke` 實現非同步處理每個客戶端的訊息迴圈,避免封鎖主監聽迴圈。
public class Client
{
string strName;
TcpClient tcpClient;
public string Name
{
get { return strName; }
set { this.strName = value; }
}
public TcpClient Socket
{
get { return tcpClient; }
set { this.tcpClient = value; }
}
public void SendMessage(Message sendMessage)
{
NetworkStream stream = tcpClient.GetStream();
stream.Write(sendMessage.GetRawMessage(), 0, sendMessage.GetRawMessage().Length);
}
}
封裝 `TcpClient` 並提供 `SendMessage` 方法,統一訊息發送邏輯。