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

Visual C# 網路程式設計之 TCP(四):完整雙機通訊範例 — 用戶端與伺服器端原始碼

     編輯:關於C語言

實作目標:簡易雙機聊天雛形

用戶端主動連線伺服器、發送訊息;伺服器監聽連線、接收並顯示訊息。此為開發 C# 版聊天室的核心基礎。

用戶端核心程式碼:SendMeg()

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();
}

伺服器端核心程式碼:StartListen()

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 作為單一訊息終結,屬簡易協定設計。正式專案建議採用「長度前綴」或「特定分隔符」協定。
  • 資源釋放:每次通訊結束即關閉 Stream 與 TcpClient,屬短連線模式。長連線需維持 TcpClient 存活並實作心跳機制。

此範例展示了 TcpClient/TcpListener 高階 API 封裝 Socket 細節的便利性,是進階網路程式設計的絕佳起點。

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