用戶端主動連線伺服器、發送訊息;伺服器監聽連線、接收並顯示訊息。此為開發 C# 版聊天室的核心基礎。
public void SendMeg()
{
try
{
int port = int.Parse(textBox3.Text); // 伺服器埠號
TcpClient tcpClient;
try { tcpClient = new TcpClient(textBox1.Text, port); }
catch (Exception le) { MessageBox.Show("TcpClient Error: " + le.Message); return; }
string timestamp = DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString();
NetworkStream netStream = tcpClient.GetStream();
StreamWriter sw = new StreamWriter(netStream);
string content = timestamp + textBox4.Text; // 訊息內容
sw.Write(content);
sw.Flush(); // 確保送出
sw.Close();
netStream.Close();
tcpClient.Close();
}
catch (Exception ex)
{
MessageBox.Show("Sending Message Failed! " + ex.Message);
}
textBox4.Clear();
}
public void StartListen()
{
isLinked = false;
try
{
int port = int.Parse(textBox1.Text); // 本地監聽埠
TcpListener serverListener = new TcpListener(port);
serverListener.Start(); // 開始監聽
}
catch (Exception ex)
{
MessageBox.Show("Can't Start Server: " + ex.Message);
return;
}
isLinked = true;
while (true) // 無限迴圈等待客戶連線
{
try
{
TcpClient tcpClient = serverListener.AcceptTcpClient(); // 阻塞直到有連線
NetworkStream netStream = tcpClient.GetStream();
StreamReader sr = new StreamReader(netStream);
string buffer = "", received = "";
received = sr.ReadLine(); // 讀取一行
while (received.Length != 0)
{
buffer += received + "\r\n";
received = sr.ReadLine();
}
listBox1.Items.Add(buffer); // 顯示於 UI
sr.Close();
netStream.Close();
tcpClient.Close();
}
catch (Exception re) { MessageBox.Show(re.Message); }
}
}
AcceptTcpClient()、ReadLine() 均為阻塞呼叫,單執行緒僅能服務單一客戶。實務上需引入 BeginAcceptTcpClient/BeginRead 非同步模式或 ThreadPool 多執行緒處理併發。\r\n 作為單一訊息終結,屬簡易協定設計。正式專案建議採用「長度前綴」或「特定分隔符」協定。TcpClient 存活並實作心跳機制。此範例展示了 TcpClient/TcpListener 高階 API 封裝 Socket 細節的便利性,是進階網路程式設計的絕佳起點。