2011-02-17 1 views
10

내 서버 - 응용 프로그램은 TIdTCPServer를 사용하며 여러 클라이언트 응용 프로그램은 TIdTCPClient를 사용하여 서버에 연결합니다 (모든 컴퓨터는 동일한 LAN에 있음).모범 사례 : 각 전송 후에 TCP/IP 연결을 열거 나 닫으시겠습니까?

일부 클라이언트는 매 2 분마다 서버에 접속해야하고 다른 서버는 초당 한 번만 접속하면됩니다.

클라이언트와 서버 간의 연결을 유지하면 재 연결을 저장하지만 연결이 끊어 졌는지 확인해야합니다.

각 전송 후에 연결을 닫으면 매번 다시 연결해야하지만 연결이 아직 있는지 확인할 필요가 없습니다.

가장 좋은 방법은 무엇입니까?

데이터 전송의 빈도는 일반적으로 연결을 유지해야합니까?

두 시나리오 모두 다른 장점과 단점은 무엇입니까?

+3

새 TCP 연결을 만드는 오버 헤드는 주로 왕복입니다. LAN에서 꽤 빠릅니다. 그래서 몇 초 후에 연결을 닫을 것입니다. – CodesInChaos

+3

하지만 우선 simples 방식으로 작성하고 (가장 가능성있는 즉시 종료) 먼저 성능이 만족 스러운지 확인하십시오. – CodesInChaos

+4

이 질문에 대한 내 대답보기 : http://stackoverflow.com/questions/4872800/socket-open-and-close-on-1-sec-or-to-hold-open/4873002#4873002 –

답변

8

두 가지가 혼합되어 있음을 제안합니다. 새 연결이 열리면 유휴 타이머를 시작하십시오. 데이터가 교환 될 때마다 타이머를 재설정하십시오. 타이머가 경과하면 연결을 닫습니다. 데이터를 보내야 할 때 연결이 닫혀 있으면 새 연결을 열고 반복하십시오. 그렇게하면 빈번하게 사용되지 않는 연결은 정기적으로 닫히고 더 자주 사용되는 연결은 열어 둘 수 있습니다.

+0

레미, 멋진 작품 지난 몇 년 동안 Indy에 관해서는 ;-) Indy의 TCP 구성 요소를 광범위하게 사용하며 분산 응용 프로그램 프레임 워크의 본질적인 부분으로 광범위하게 사용합니다. 좀 더 살펴보고 싶을 수도 있습니다. – Misha

6

몇 분마다 한 번씩 활성화되는 응용 프로그램에 연결하고 연결을 끊는 것이 좋을 수도 있지만 연결을 열린 상태로두면 여러 번 통신하는 응용 프로그램의 성능이 향상됩니다.

또한 열려있는 연결을 계속 열거 나 닫거나 진단하지 않으려는 경우 코드가 훨씬 간단 해집니다. 적절한 열기 및 닫기 논리와 SEH를 사용하여 읽고 쓰고 있다면 소켓을 사용하기 전에 연결되어 있는지 테스트 할 필요가 없습니다. 사용하기 만하면됩니다. 문제가있을 때 알려줍니다.

대부분의 엔터프라이즈 응용 프로그램에서 단일 연결을 열어 두는 경향이 있습니다. 일반적으로 코드를보다 깨끗하게 유지하기 때문에 유지 관리가 더 쉽습니다. 실험에서

/twocents

8

두 센트 ...

나의 첫 번째 TCP/IP 클라이언트/서버 응용 프로그램이 각 요청에 대한 새로운 연결과 새 스레드를 사용하고 있었다 ... 년 전 ...

그런 다음 (ProcessExplorer 사용) 모든 닫힌 연결이 실제로 파괴되지 않았으므로 일부 네트워크 리소스를 소비 함을 발견했지만 얼마 동안은 특정 상태로 남아 있습니다. 많은 스레드가 생성되었습니다 ...

많은 동시 요청과 관련하여 일부 연결 문제가 있습니다. 서버에 충분한 포트가 없었습니다!

그래서 I rewrote it은 HTTP/1.1 스키마와 KeepAlive 기능을 따릅니다. 그것은 훨씬 더 효율적이고, 소수의 쓰레드를 사용하며, ProcessExplorer는 새로운 서버를 좋아합니다. 그리고 나는 다시 항구를 다 써 버리지 않습니다. 클라이언트가 될 종료가있는 경우 :

, 나는 한마디로 ... 적어도, 클라이언트마다 스레드를 생성하지 않는하기

을 스레드 풀을 사용합니다 : 당신이 당신의 클라이언트를 유지할 수있는 경우 몇 분 동안 연결이 살아 있습니다.

3

나는 그것이 서버의 사용 가능한 대역폭과 하드웨어는 말할 것도없고 주어진 시간에 서버에서 이루어진 요청의 양과 목표에 달려 있다고 생각합니다.

미래에도 생각해 볼 필요가 있습니다. 향후에 연결을 열어 두어야 할 가능성이 있습니까? 그렇다면 자신의 질문에 대답했습니다.

~ 50 명 (2 개월마다 숫자가 커짐)이 항상 연결되어 있고 채팅 외에도 데이터 전송, 특정 명령을 사용한 데이터베이스 조작 등이 포함 된 프로젝트 용 채팅 시스템을 구현했습니다. 구현은 서버에 대한 연결을 응용 프로그램 시작에서 응용 프로그램이 닫힐 때까지 열어 두지 만 지금까지는 문제가 없지만 어떤 이유로 연결이 끊어지면 자동으로 다시 설정되고 모든 것이 완벽하게 계속됩니다.

전반적으로 두 가지를 모두 사용하는 것이 좋습니다 (연결을 열어두고 사용 후 닫는 것). 가장 적합한 것을 확인하십시오.

3

수백 개의 동시 연결로 확장하지 않는다면 확실히 개방형으로 유지할 것입니다. 이것은 두 가지 옵션 중 훨씬 우수합니다. 수천 개의 동시 연결로 수백 개를 확장 한 후에는 연결을 끊었다가 다시 연결해야 할 수 있습니다. 필자는 필요할 때마다 서버에서 클라이언트로 데이터를 "밀어 넣을"수 있기 때문에이 전체 프레임 워크 (http://www.csinnovations.com/framework_overview.htm)를 바탕으로 전체 프레임 워크를 구성했습니다. 연결이 작동하고 작동하는지 확인하기 위해 (네트워크 중단, 시간 초과 된 핑 등) 상당한 양의 코드를 작성해야하지만 "프레임 워크"에서 이렇게하면 응용 프로그램 코드를 다음과 같이 작성할 수 있습니다. 연결이 항상 "위로"있다고 가정 할 수 있습니다.

0

문제는 응용 프로그램 당 스레드 수가 약 1400 개로 제한됩니다. 최대 1300 개의 클라이언트가 동시에 연결됩니다. + -.

+0

OS 스레드 풀이 클라이언트 스레드가 아닌 Indy 서버에서 구현 된 것을 볼 수 있지만 여기에서 주장하는 것은 정확하지 않습니다. https://blogs.msdn.microsoft.com/oldnewthing/20050729-14/?p=34773 – Victoria

0

클라이언트로 연결을 닫으면 잠시 동안 사용했던 포트를 사용할 수 없게됩니다. 따라서 많은 양의 다른 포트를 사용하고 있습니다. 반복적으로 나는 그것을 열어 두었다.