2012-08-02 2 views
1

Net.Sockets.Socket 클래스를 사용하여 TCP 서버를 작성합니다. TCP는 스트림에서 작동하기 때문에 서로 메시지를 분리하는 방법이 필요합니다. (자세한 내용은 그의 블로그 here에있는 Stephen Cleary의 메시지 프레이밍 게시판을 참조하십시오.)TCP 서버/클라이언트에 대한 사용자 지정 메시지 프레이밍 프로토콜

사용자 삽입 메시지 프레이밍 프로토콜을 지원하는 TCP 서버 클래스를 작성하고 싶습니다. 이 클래스의 예 초기화가 여기에 있습니다 :

var receiveDelimiter = Encoding.UTF8.GetBytes("[END]"); 
var sendDelimiter = Encoding.UTF8.GetBytes("\r\n"); 
var protocol = new DelimiterFramingProtocol(receiveDelimiter, sendDelimiter); 
var server = new Server(protocol); 
server.Start(port); 

프로토콜

는 추상 클래스 MessageFramingProtocol에서 파생되어야하며, 서버는 메시지를 분리해서 그것을 사용할 수 있어야합니다. 위의 예에서 서버는 구분 기호 ("[END]")가 수신되고 DataReceived 인수가 구분 기호 앞에있는 메시지 부분 만 가져야하는 경우 해당 DataReceived 이벤트를 발생시켜야합니다. 구분 기호 다음에 수신 된 바이트가 더 많은 경우 서버는이를 저장하고 구분 기호가 다시 수신 될 때만 DataReceived를 시작해야합니다. 서버는 sendDelimiter를 전송할 때마다 sendDelimiter를 전송해야합니다.

내가 필요한 것은이 전체 서버 클래스 나 프로토콜 클래스가 아닙니다. 내가 필요로하는 것은 템플릿, 디자인 조언이다. 서버 클래스에 Protocol이라는 FramingProtocol 유형의 속성이 있다고 가정하면 Server 클래스에서 작업을 받고 보내는 데 어떻게 사용할 수 있습니까? 위에서 볼 수있는 유연성을 제공하기 위해 어떤 추상 메소드/속성이 있어야합니까? FramingProtocol에서 파생 된 사용자 지정 프로토콜 클래스를 작성할 수 있어야합니다. 구분 기호, 길이 접두어, 둘 다를 사용하거나 별도의 메시지에 대한 사용자 지정 방식을 사용할 수 있습니다.

답변

1

나는 서버에 전달되는 프로토콜 인스턴스 하나만 가지고 가지 않을 것입니다. 많은 프로토콜이 필요합니다. 새 프로토콜 인스턴스를 작성하거나 시작시 작성되고 채워진 풀에서 해당 프로토콜 인스턴스를 제거하는 팩토리 클래스를 서버에 제공하십시오.

내가 일반적으로 무엇을이 같은 것입니다 :

RX : 는 'INT 프로토콜 : addBytes (문자 * 데이터 INT 렌)'기능을 제공합니다. raw rx 데이터의 주소와 길이를 가진 Fed 함수는 -1을 반환합니다 (프로토콜 단위를 완전히 어셈블하지 않고 모든 원시 데이터를 소비했음을 의미). 또는 점에서 소비 된 데이터의 인덱스 인 양의 정수를 반환합니다. 유효한 PDU를 조립했다. 인스턴스가 PDU를 어셈블 할 경우 추가 처리가 가능합니다 (예 : 'DataReceived (Protocol * thisPDU)'이벤트 발생 및 생성 된 새로운 프로토콜 인스턴스 (또는 depooled), 나머지 원시 데이터로로드 됨

TX : 'bool Protocol :: loadFrom (SomeDataClass * outData, OutStreamClass * outStream)'메서드를 사용하여 모든 소스에서 내부 멤버 변수로 데이터를로드하여 전체 멤버 집합을 직렬화 된 PDU를 생성하기위한 데이터가 존재하고 (false를 반환하거나 제공된 문제가있는 경우 예를 들어 예외가 발생합니다. 예를 들어 제공된 데이터가 온전한 검사를 통과하지 못합니다.) 오류가 감지되지 않으면 인스턴스는 전달 된 ' outStream 'stream/socket/buffer + len.

관련 문제