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

C# 即時應用開發實戰:TCP Socket 通訊與 XML 資料即時推送(三)

     編輯:關於C語言

伺服器端 XML 載入與廣播執行緒

LoadXMLThread 方法展示如何從本地 XML 文件讀取資料、解析節點並即時推送至所有連線客戶端:

public void LoadXMLThread() {
  MethodInvoker miv = new MethodInvoker(this.UpdateListView);
  string tmp = null, XMLString = null;
  int recordFlg = -1, textCount = 0;
  XMLString = "\v" + " version='1.0'?>";
  XmlTextReader tr = new XmlTextReader("issue.XML");
  while (tr.Read()) {
    switch (tr.NodeType) {
      case XmlNodeType.Element:
        if (tr.Name == "Issue") {
          recordFlg++;
          if (recordFlg > 0) {
            textCount = 0;
            xmlString += CreateXMLElement(tr.Name, 2);
            XMLString += "\n";
            SendDataToAllClient(XMLString);
            XMLString = "\v" + " version='1.0'?>";
            this.BeginInvoke(miv);
            JobDone.WaitOne();
          }
        }
        if (recordFlg >= 0) {
          xmlString += CreateXMLElement(tr.Name, 1);
          tmp = tr.Name;
        }
        break;
      case XmlNodeType.Text:
        switch (++textCount) {
          case 1: isu.symbol = tr.Value; break;
          case 2: isu.bid = tr.Value; break;
          case 3: isu.offer = tr.Value; break;
          case 4: isu.volume = tr.Value; break;
        }
        XMLString += tr.Value;
        xmlString += CreateXMLElement(tmp, 2);
        break;
    }
  }
  fThd.Abort();
}

string CreateXMLElement(string elem, int ord) {
  if (ord == 1) return String.Format("<{0}>", elem);
  else return String.Format("", elem);
}

關鍵點:

  • 使用 XmlTextReader 快速前向讀取 XML,記憶體效率高。
  • 逐筆記錄組裝 XML 片段,透過 SendDataToAllClient 廣播。
  • BeginInvoke(miv) 將 UI 更新委派至主執行緒,JobDone.WaitOne() 同步等待 UI 更新完成,確保資料一致性。
  • 自訂協議:以 \v (VT) 為訊息起始、\n 為結束標記,提升客戶端解析穩定性。

客戶端 ListView 即時更新與視覺特效

private void UpdateListView() {
  int ind = -1;
  for (int i = 0; i < this.listView1.Items.Count; i++)
    if (this.listView1.Items[i].Text == isu.symbol.ToString()) { ind = i; break; }

  if (ind == -1) {
    // 新增項目
    ListViewItem newItem = new ListViewItem(isu.symbol.ToString());
    newItem.SubItems.AddRange(new[] { isu.bid, isu.offer, isu.volume });
    this.listView1.Items.Add(newItem);
    int i = this.listView1.Items.IndexOf(newItem);
    setRowColor(i, Color.FromArgb(255, 255, 175));
    setColColorHL(i, 0, Color.FromArgb(128, 0, 0));
    setColColorHL(i, 1, Color.FromArgb(128, 0, 0));
    this.listView1.Update();
    Thread.Sleep(300); // 視覺閃爍效果
    setColColor(i, 0, Color.FromArgb(255, 255, 175));
    setColColor(i, 1, Color.FromArgb(255, 255, 175));
  } else {
    // 更新現有項目
    this.listView1.Items[ind].Text = isu.symbol.ToString();
    this.listView1.Items[ind].SubItems[1].Text = isu.bid;
    this.listView1.Items[ind].SubItems[2].Text = isu.offer;
    this.listView1.Items[ind].SubItems[3].Text = isu.volume;
    setColColorHL(ind, 0, Color.FromArgb(128, 0, 0));
    setColColorHL(ind, 1, Color.FromArgb(128, 0, 0));
    this.listView1.Update();
    Thread.Sleep(300);
    setColColor(ind, 0, Color.FromArgb(255, 255, 175));
    setColColor(ind, 1, Color.FromArgb(255, 255, 175));
  }
  JobDone.Set();
}

輔助方法 setRowColor、setColColor、setColColorHL 實現交替列底色、欄位高亮閃爍效果,提升即時資料可讀性。

執行步驟與部署注意事項

  1. 機器 A 執行 TcpServer.exe。
  2. 機器 A/B 執行一或多個 TcpClient.exe。
  3. 客戶端選單「連線」→ 輸入伺服器 IP/Port、用戶名/密碼 → 確認。
  4. 伺服器 ListView 顯示客戶端連線提示後,點選「Load Data」選單,即時資料雙端同步顯示。

注意: 確保 Data file、Issue.txt、Issue.XML 與執行檔位於同一根目錄。HashTable 存取需加鎖確保執行緒安全。伺服器發送訊息前後加入起始/結束字元,增強客戶端穩定性。

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