golang 클라이언트, 소켓 통신 문제로 서버, C 번호 (통일)을 할

서버 메시지 DATALEN + -----> PackageData ------> 네트워크 전송 ([] 바이트) -----> 클라이언트 ----> UnPackageData ----> DATALEN + 메시지

네트워크는 사용자 정의 프로토콜을 필요로하기위한 Soket으로 프로그램을 작성.

{렌 + 데이터} 렌 데이터는 데이터를 전송하고자 파싱, 데이터 길이 데이터를 파싱

 서버에서 메시지

클라이언트 메시지

클라이언트가 필요하고 서비스의 JSON 태그 끝이라는 메시지 필드가 유지되어 있습니다. 그렇지 않으면, 서버는 JSON없는 필드 (나는 밤 발견이 버그 플러스 아침) 구문 분석

사용하여 시스템;
사용 System.Collections.Generic 단계;
사용 을 System.Linq 단계;
사용 System.Text 단계;
사용 System.Threading.Tasks 단계;
사용 Newtonsoft.Json 단계; 
[직렬화] 
공용  클래스 메시지 
{ 
    공공  문자열 execute_type;
    공공  문자열 struct_name;
    공공  문자열 데이터; 
} 
클래스 폴더의 유틸리티 
{ 
    ///  <요약> 
    /// 包装数据
     ///  </ 요약> 
    ///  <PARAM NAME = "데이터"> </ PARAM> 
    /// <매개 변수 이름 = "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 렌); 
        메시지 메시지 = 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