簡體   English   中英

進程間通信包創建

[英]Inter-process communication packet creation

我正在寫一個進程間通信協議,其中ac#客戶端在將用不同語言(Java,C,C ++等)編寫的服務器進程中調用API。這兩個進程都在同一台機器上運行,並且通信層本身並不是問題(當前我正在使用套接字,因為大多數語言都支持套接字,但是以后可能會使用共享內存)總共大約有180個API,每個API都有自己的各種類型的參數集。 由於服務器可以用任何語言編寫,因此我將所有參數轉換為字節數組,將其放入具有API標識符的數據包中,然后將其發送到其他進程,在此將根據API標識符對其進行解碼。 來自服務器進程的返回數據將以相同的方式格式化。

我正在尋找的是最快的方法(最好是單個函數),該方法將可變數量的不同類型的參數轉換為字節數組。 當前,我正在使用BitConverter類將每個參數轉換為字節數組,並將所有數組連接為一個。 除字符串外,沒有引用類型的參數,這些參數將轉換為字節數組,其中前2個字節包含字符串長度。 我對客戶端和服務器都有控制權,因此每個人都知道期望數據包中參數的順序(基於API ID)以及每個參數的大小。

如果還有另一種方法或如何使用單個函數來執行此操作,例如:

byte[] toByteArray (variable-number of different-type parameters…)

請告訴我。 由於API調用的頻率很高,因此性能是一個問題。

我認為您應該嘗試使用Google的協議緩沖區: https//developers.google.com/protocol-buffers/

Protobuf與語言無關。 因此,您可以定義自己的結構,然后為Java,C#,C ++等生成特定的代碼。

我選擇使用以下代碼。 最初擔心使用參數和裝箱/拆箱會對性能造成影響,但經過一些分析后,結果卻可以忽略不計。 這里適合任何有興趣的人。

    public static int ToByteArray (byte[] bytes, int Offs, params object[] args)
    {
        int CurrIdx = Offs;

        for (int i=0; i<args.Length; i++)
        {
            object obj = args[i];
            if (obj is int)
            {
                int x = (int) obj;
                bytes[CurrIdx++] = (byte)(x & 0xff);
                bytes[CurrIdx++] = (byte)((x >> 8) & 0xff);
                bytes[CurrIdx++] = (byte)((x >> 16) & 0xff);
                bytes[CurrIdx++] = (byte)((x >> 24) & 0xff);
            }
            else if (obj is double)
            {
                double x = (double)obj;
                System.Buffer.BlockCopy(BitConverter.GetBytes(x), 0, bytes, CurrIdx, sizeof(double));
                CurrIdx += sizeof(double);
            }
            else if (obj is string)
            {
                string x = (string)obj;
                int ByteLen = x.Length * sizeof(char);
                bytes[CurrIdx++] = (byte)(x.Length & 0xff);
                bytes[CurrIdx++] = (byte)((x.Length >> 8) & 0xff);
                System.Buffer.BlockCopy(x.ToCharArray(), 0, bytes, CurrIdx, ByteLen);
                CurrIdx += ByteLen;
            }
        }
        return (CurrIdx - Offs);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM