2009-02-27 4 views
0

IR 명령 라우팅을 위해 GlobalCache GC-100-12와 통신하는 서버 응용 프로그램 (싱글 톤, 간단한 .NET 콘솔 응용 프로그램)이 있습니다. 로컬 네트워크의 다양한 .NET WinForm 클라이언트가 내 서버 응용 프로그램에 연결하여 ASCII 명령을 전송합니다. 서버 응용 프로그램은 이러한 ASCII 명령을 대기열에 넣은 다음 TCP 연결을 통해 GC-100-12로 보냅니다.C#에서이 TCP 연결을 처리하는 가장 좋은 방법은 무엇입니까?

제 질문은 서버의 관점에서이 연결을 처리하는 가장 좋은 방법은 무엇입니까?

  1. 생성 및 각 개별 요청에 대한 새로운하여 TcpClient를 엽니 다 : 나는 두 가지 방법으로 생각할 수 있습니다. 요청이 완료되면 TcpClient를 닫습니다.

  2. 서버가 시작될 때 하나의 TcpClient를 만들고여십시오. 필요한 경우 연결 유지를 사용하여 서버 개체의 수명 동안 연결을 열어 두십시오.

각 요청마다 새 TcpClient를 만드는 오버 헤드가 궁금하기 때문에이 질문을드립니다. 그것은 비싼 수술입니까? 이것은 나쁜 습관입니까?

현재 # 1을 (를)하고 각 전송 결과를 콘솔에 인쇄하고 있습니다. 때로는 일부 연결 시간 초과 및 명령 라우팅되지 않습니다 및 매번 새로운 TcpConnection을 만드는 오버 헤드 때문에 또는 그것이 다른 이유로 인한 것인지 궁금 해서요.

연결이 끊어지면 다시 만들어야하고 그 상황을 처리하는 데 약간 더 많은 코드가 필요하기 때문에 # 2가 더 복잡하다는 것을 알 수 있습니다.

이에 대한 일반적인 조언을 찾고 있습니다. TcpClient 클래스에 대한 많은 경험이 없습니다.

답변

3

이전의 PICK 기반 시스템에 대한 텔넷 세션을 여는 경우가있었습니다. 우리는 요청이 들어올 때마다 TCP 연결을 여는 데 드는 비용이 상당히 비쌌으며, 우리는 연결을 유지하기 위해 no-op 루틴을 구현하기로 결정했습니다. 더 복잡하지만, 엔드 포인트가 많은 클라이언트에게 서비스를 제공하지 않는 한, 연결을 고정하는 것이 실행 가능한 솔루션처럼 들릴 수 있습니다.

트래픽이 없을 때 연결을 유지하지 않으려면 시간 제한을 설정할 수도 있습니다. 5 분간 활동이 없으면 연결을 끊습니다.