程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#網絡編程(訂立協議和發送文件) - Part.4(2)

C#網絡編程(訂立協議和發送文件) - Part.4(2)

編輯:關於C語言

2.協議處理類的實現

和上面一章一樣,在開始編寫實際的服務端客戶端代碼之前,我們首先要編寫處理協議的類,它需要 提供這樣兩個功能:1、方便地幫我們獲取完整的協議信息,因為前面我們說過,服務端可能將客戶端的 多次獨立請求拆分或合並。比如,客戶端連續發送了兩條控制信息到服務端,而服務端將它們合並了,那 麼則需要先拆開再分別處理。2、方便地獲取我們所想要的屬性信息,因為協議是XML格式,所以還需要一 個類專門對XML進行處理,獲得字符串的屬性值。

2.1 ProtocalHandler輔助類

我們先看下ProtocalHandler,它與上一篇中的RequestHandler作用相同。需要注意的是必須將它聲明 為實例的,而非靜態的,這是因為每個TcpClIEnt都需要對應一個ProtocalHandler,因為它內部維護的 patialProtocal不能共享,在協議發送不完整的情況下,這個變量用於臨時保存被截斷的字符串。

public class ProtocolHandler {

    private string partialProtocal; // 保存不完整的協議

    public ProtocolHandler() {
        partialProtocal = "";
    }

    public string[] GetProtocol(string input) {
        return GetProtocol(input, null);
    }

    // 獲得協議
    private string[] GetProtocol(string input, List<string> outputList) {
        if (outputList == null)
            outputList = new List<string>();

        if (String.IsNullOrEmpty(input))
            return outputList.ToArray();

        if (!String.IsNullOrEmpty(partialProtocal))
            input = partialProtocal + input;

        string pattern = "(^<protocol>.*?</protocol>)";

        // 如果有匹配,說明已經找到了,是完整的協議
        if (Regex.IsMatch(input, pattern)) {

            // 獲取匹配的值
            string match = Regex.Match(input, pattern).Groups[0].Value;
            outputList.Add(match);
            partialProtocal = "";

            // 縮短input的長度
            input = input.Substring(match.Length);

            // 遞歸調用
            GetProtocol(input, outputList);

        } else {
            // 如果不匹配,說明協議的長度不夠,
            // 那麼先緩存,然後等待下一次請求
            partialProtocal = input;
        }

        return outputList.ToArray();
    }
}

因為現在它已經不是本文的重點了,所以我就不演示對於它的測試了,本文所附帶的代碼中含有它的 測試代碼(我在ProtocolHandler中添加了一個靜態類Test())。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved