golangは、ソケット通信の問題は、クライアントとサーバー、C#の(ユニティ)を行います

サーバdatalenを+メッセージ-----> PackageData ------>ネットワーク伝送([]バイト)----->クライアント----> UnPackageData ----> datalenを+メッセージ

ネットワークは、独自のカスタムプロトコルを必要とするためSoketでプログラムを書きます。

{レン+データ} LENは、データを解析されたデータの長さ、データが解析されたデータを転送します

 サーバー上のメッセージ

クライアントメッセージ

サービスのJSONタグの端をという名前のクライアントのニーズやメッセージフィールドが維持されていることに注意してください。そうしないと、サーバは(このバグは、私は夜プラス朝を発見した)JSON欠落しているフィールドを解析します

使用してシステムを。
使用してSystem.Collections.Genericを。
使用してSystem.Linqのを。
使用してSystem.Textのを。
使用してSystem.Threading.Tasksを。
使用してNewtonsoft.Jsonを。
[直列化] 
パブリック クラスメッセージ
{ 
    パブリック 文字列execute_type。
    公共の 文字列struct_name。
    公共の 文字列データを、
} 
クラスutilの
{ 
    ///  <要約> 
    /// 包装数据
     ///  </要約> 
    ///  <PARAM NAME = "データ"> </ PARAM> 
    /// <PARAM NAME = "exeCuteType"> </ PARAM> 
    ///  <PARAM NAME = "クラス名"> </ PARAM> 
    パブリック 静的 バイト [] PackageData(オブジェクトデータ、文字列 exeCuteType、ストリングクラス名)
    { 
        ストリング jsonData = JsonConvert.SerializeObject (データ); 
        
        // バイト[] byteData = Encoding.UTF8.GetBytes(jsonStr)。
        メッセージメッセージ= 新しいメッセージ()。
        message.struct_name = クラス名。
        message.data = jsonData。
        message.execute_type = exeCuteType。

        
        バイト[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(メッセージ))。
        INT32 LEN = byteData.Length。
        バイト [] lenData = BitConverter.GetBytes(LEN)。
        バイト [] finalData = 新しい バイト [lenData.Length + byteData.Length]。
        lenData.CopyTo(finalData、0 ); 
        byteData.CopyTo(finalData、4 )。
        返すfinalDataを。
        
    } 
    ///  <要約> 
    /// 拆分数据
     ///  </要約> 
    ///  <PARAM NAME = "データ"> </ PARAM> 
    /// <リターン> </戻り> 
    パブリック 静的メッセージUnPackageData(バイト[]データ)
    { 
        のInt32 LEN = BitConverter.ToInt32(データ、0 ); 
        System.Console.WriteLine(LEN)。
        バイト [] strByte = 新しい バイト[LEN]。
        Array.Copy(データ、4、strByte、0 、LEN)。
        メッセージmessage = JsonConvert.DeserializeObject <メッセージ> (Encoding.UTF8.GetString(strByte))。
        リターン・メッセージ。

    } 
}
// 没有??行く
 // 包装数据 
FUNC PackageData(データインターフェース {}、executeType列、structType列)[] バイト{ 
    dataByte、ERR: = json.Marshal(およびデータ)
     場合!ERR = ゼロ{ 
        config.Logger。 Fatalln( "解析出错" 、ERR)
    } 
    strJson: = 文字列(dataByte)
    MSG: = メッセージ{} 
    msg.ExecuteType = executeType 
    msg.Data = strJson 
    msg.StructName = structType 
    finalData、ERR: = json.Marshal(&MSG)
    場合!=誤るゼロ{ 
        log.Fatalln( "解析失败" 、ERR)
    } 
    VARのlenByteを =作る([] バイト、4 
    長さ: = UINT32(LEN(finalData))
    binary.LittleEndian.PutUint32(lenByte、長さ)


    ALLDATA : = [] [] バイト{lenByte、finalData} 
    あるnewData: = bytes.Join(ALLDATA、[] バイト( "" ))

    を返すあるnewData 

} 
// 解析数据 
FUNC UnPackageData(データ[] バイト)(メッセージ、エラー){
     // のprintln( "总长度=:"、LEN(データ)) 
    MES:=メッセージ{}
     // UTF8。
    ByteBuffer:= bytes.NewBuffer(データ[0:4 ])
    VAR DATALEN INT32 
    ERR: = binary.Read(ByteBufferの、binary.LittleEndian、&DATALEN)// binary.BigEndian.Uint32(データ[:4])
    の場合、ERR =!ゼロ{ 
        config.Logger.Println(ERR)
    } 
    ERR = json.Unmarshal(データ[4:4 + DATALEN]、&MES)
     なら!ERR = ゼロ{ 
        fmt.Println( "解析失败" 、ERR)
    } 

    戻りMES、 ERR 
}

 

おすすめ

転載: www.cnblogs.com/Jokerlearn/p/10929818.html