2009-10-14 2 views
0

비슷한 질문이 이미 제기되었다고 생각되지만 어떤 것도 찾을 수 없었습니다. 언제든지 기존 솔루션을 알려주십시오.C#에서 많은 클라이언트를위한 프로그래밍하기 쉬운 서버를 만드는 방법은 무엇입니까?

내 시나리오를 설명합니다. 서버 응용 프로그램을 만들고 싶습니다. 한 대의 컴퓨터에서 실행되는 서버에 연결하는 많은 클라이언트 (현재는 수십 가지이지만 최대 1000+ 이상으로 확장해야 함)가 있습니다.

각 클라이언트는 주기적으로 처리 할 서버에 소량의 데이터를 보냅니다 (처리가 빠름). 또한 서버는 정기적으로 각 클라이언트에 소량의 데이터를 보낼 수 있습니다. 응답 시간은 낮아야하며 (< 100ms) 실시간 또는 이와 유사한 것은 필요하지 않습니다.

VB6에서 프로그래밍 중이던 때가 처음 생각났습니다. 들어오는 요청을 수신 할 서버 소켓을 만든 다음 가능한 클라이언트 (singlethreaded)마다 클라이언트 소켓을 만듭니다. 나는 이것이 잘 비늘하다고 생각한다. 또한 의사 소통을 구현하기가 어렵습니다.

그래서 나는 새로운 클라이언트 연결을 받아들이는 청취자 스레드와 실제로 클라이언트가 들어오는 데이터를 읽는 다른 스레드를 만들 것이라고 생각했습니다. 많은 클라이언트가 있기 때문에 각 클라이언트에 대한 스레드를 만들고 싶지 않습니다. 대신 단일 스레드를 사용하여 루프에서 들어오는 모든 데이터를 읽은 다음이 데이터를 직접 처리하거나 처리 할 다른 스레드에 대한 작업 항목을 만드는 것을 선호합니다. 이 방법이 충분히 확장 될 것으로 생각합니다. 이 아이디어에 대한 의견은 언제나 환영합니다.

걱정되는 나머지 문제는 의사 소통이 쉽습니다. 위의 해결책은 TCP를 통해 ASCII 명령을 보내는 수동 프로토콜을 요구하는 것 같습니다. 이 일을하는 동안, 나는 더 나은 방법이 있어야한다고 생각합니다.

일부 인터페이스/프록시 방식은 합리적인 것처럼 보입니다. 이전에 Java RMI에서 약간 작업했습니다. 이해의 제 시점에서 .NET Remoting은 비슷한 목적을 제공합니다. Remoting은 내가 설명한 시나리오 (많은 고객)에 대한 실현 가능한 솔루션입니까? 내가 아직 모르는 더 좋은 방법이 있습니까?

편집 :

  • 이 LAN에서 아니지만, 인터넷, 그것은 중요합니다.
  • 가능하면 Linux에서도 실행해야합니다.
+1

WCF가이를 수행하는 더 좋은 방법입니다. –

답변

4

AresnMkrt가 지적했듯이 WCF를 사용해보십시오. netTcpBinding을 그대로 사용하면서 보안 기능을 해제하는 것을 잊지 마세요. 성능이 요구 사항을 충족하는지 측정합니다.

그렇지 않은 경우 WCF를 조정할 수 있습니다. WCF는 매우 확장 가능하며 사용자가 원하는대로 ASCII 메시지를 보내도록 메시지 직렬화를 수정할 수 있습니다.

1

바이너리 프로토콜이 필요합니까? 오히려 JSON/XML을 사용하여 일반적인 RESTful 서비스가 충분할 경우 완전히 새로운 프로토콜을 만들어야 할 필요가 있습니까? WCF는 이와 관련하여 많은 도움을 드릴 수 있습니다.

관련 문제