2011-12-19 2 views
1

많은 패킷을 보내는 네트워크 응용 프로그램을 개발 중입니다. 현재, 직렬화 방법은 객체의 목록을 파이프 문자 '|'로 구분 된 문자열로 변환하는 해킹 일뿐입니다. 네트워크 스트림으로 플러시 (또는 UDP를 통해 전송)합니다.C# - 네트워크를 통한 패킷 일련 화

패킷 크기를 최소화하면서 (C#에서는 거대한 XML 직렬화가 필요 없음) C#에서 더 깨끗한 해결책을 찾고 있습니다.

내 경험이 BinaryFormatter is SLOW입니다. 또한 base64 문자열로 인코딩하여 내 패킷을 압축하여 클라이언트 쪽에서 디코딩하는 것을 고려 중입니다. 이것이 응용 프로그램의 성능에 어떻게 영향을 주는지에 대한 의견을 듣고 싶습니다.

또한, 다른 빠른 질문 :

내 설정은 2 소켓 (한 TCP and UDP)를 생성하고 클라이언트는이 두 소켓에 개별적으로 연결합니다. 데이터는 필요에 따라 하나씩 삭제됩니다 (중요한 항목은 TCP, 중요하지 않은 항목은 UDP). 이것은 처음으로 TCP/UDP를 사용하여 궁금해졌습니다. 더 통일 된 방법이 있다면 그렇게 보이지는 않지만 궁금합니다.

대단히 감사드립니다.

답변

2

내가 Google's Protocol Buffers 유사한 바이너리 프로토콜을 사용하기위한 ProtoBuf를 사용으로 볼 수 있었다. John Skeet의 protobuf-csharp-port을 사용하면 IMessage 및 IBuilder에서 각각 WriteDelimitedTo 및 MergeDelimitedFrom 메서드를 사용할 수 있습니다. 이것들은 메시지의 끝에 바이트 수를 붙이기 때문에 다른 쪽에서 사용할 수 있습니다. 정의 메시지는 정말 쉬운 :

message MyMessage { 
    required int32 number = 1; 
} 

이 그럼 당신은 ProtoGen.exe으로 C#을 클래스를 구축하고 단지 마을로 이동합니다. protobuffers (특히 protobuf-csharp-port)의 큰 이점 중 하나는 모든 엔드 포인트를 동시에 업그레이드해야하는 것은 아니라는 것입니다. 오류없이 이전 버전에서 새 필드를 추가하고 사용할 수 있습니다.이 버전의 독립성은 매우 강력 할 수 있지만, 당신이 그것을 계획하지 않는 경우 또한 당신을 물지 수

0

개인적으로 다음 시스템을 사용했습니다. 모든 패킷의 파생 된 추상 패킷 클래스가 있습니다. 패킷 클래스는 두 가지 가상 메서드를 정의합니다.

void SerializeToStream(BinaryWriter serializationStream) 
void BuildFromStream(BinaryReader serializationStream) 

이 수동 직렬화를 통해 작은 크기의 패킷을 만들 수 있습니다. 소켓으로 보내기 전에 패킷의 길이는 접두어이며 고유 한 패킷 유형 ID 번호로 시작됩니다. Receiving end는 Activator.CreateInstance를 사용하여 적절한 패킷을 만들고 BuildFromStream을 호출하여 패킷을 재구성 할 수 있습니다.

예 패킷 :

class LocationUpdatePacket : Packet 
{ 
    public int X; 
    public int Y; 
    public int Z; 

    public override void SerializeToStream(BinaryWriter serializationStream) 
    { 
     serializationStream.Write(X); 
     serializationStream.Write(Y); 
     serializationStream.Write(Z); 
    } 
    public override void BuildFromStream(BinaryReader serializationStream) 
    { 
     X = serializationStream.ReadInt32(); 
     Y = serializationStream.ReadInt32(); 
     Z = serializationStream.ReadInt32(); 
    } 
} 
+0

BinaryReader/Writer를 피하는 이유는 BinaryFormatter가 얼마나 느린가 때문입니다. 이 VS BFormatter의 속도에 대한 아이디어가 있습니까? –

0

내가 패킷을 많이 전송하는 네트워크 응용 프로그램을 개발하고)

체크 아웃 networkComms.net , 오픈 소스 네트워크 통신 라이브러리를 사용하면 상당한 시간을 절약 할 수 있습니다. 그것은 serialization을 위해 protobuf를 통합합니다. 예를 들어 here, 408 줄입니다.