비동기 소켓 프로그래밍 스타일의 C#으로 간단한 웹 서버를 만들려고합니다. 그 목적은 매우 좁습니다 - 혜성 서버 (http long-polling).웹 서버 - 요청을 구문 분석하는 방법? 비동기 스트림 Tokenizer?
Windows 서비스가 실행 중이며 연결을 수락하고 콘솔에 요청 정보를 보내고 간단한 고정 콘텐츠를 클라이언트에 반환합니다.
이제 요청 데이터를 비동기 적으로 안전하게 구문 분석 할 수있는 관리 가능한 전략을 알 수 없습니다. 이전에 동기식 LL1 파서를 작성했습니다. LL1 파서가 HTTP에 적절하거나 필요한지 확실하지 않습니다. 입력 스트림을 비동기 적으로 토큰 화하는 방법을 모르겠습니다. 내가 생각할 수있는 것은 클라이언트마다 입력 버퍼가 있고, 그 내용을 읽은 다음이를 StringBuilder에 복사하고 주기적으로 전체 요청이 있는지 확인하는 것입니다. 하지만 이는 비효율적이며 코드를 디버그/유지하기가 어려울 수 있습니다.
또한 요청을 완전히 수신하고 응답을 보내는 연결의 두 단계가 있습니다.이 경우에는 약간의 지연이 있습니다. 요청이 확인되고 실행 가능하면 긴 폴링 관리자에 연결을 등록 할 계획입니다. 그러나 오작동하는 클라이언트는 계속 데이터를 보내고 버퍼를 채울 수 있으므로 응답 단계에서 입력 스트림을 계속 모니터링하고 비워야 할 필요가 있다고 생각합니까?
이에 대한 안내는 감사하겠습니다.
첫 번째 단계는 네트워크 스트림을 비동기 적으로 효율적으로 토큰화할 수 있는지 여부와 대형 중간 버퍼없이 토큰화할 수 있는지 여부입니다. 적절한 구문 분석기가 없어도 한 번에 입력의 "줄"을 읽거나 두 줄의 빈 줄 (하나의 큰 토큰)까지 읽는 경우에도 tokenizer 만들기와 동일한 문제가 적용됩니다. 네트워크에서 한 번에 한 바이트 씩 읽지는 않겠지 만 너무 많은 바이트를 읽고 싶지 않고 중간 버퍼에 저장해야합니다.
감사합니다. 버퍼링 된 읽기에 걸터 앉을 때 해당 순서로 복원 할 수있는 순서를 확인하는 좋은 방법은 무엇입니까? 요청이 너무 길 때 *? 그 시점 이후에 입력 스트림을 비우지 않으면 안되며 버퍼가 가득 차거나 다른 연결에 영향을주지 않고 추가 입력을 안전하게 무시할 수 있습니까? –