서버 메시지 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 }