2011-02-16 6 views

답변

2

예외 발생은 정상적인 동작입니다. Indy는 오류 처리뿐만 아니라 내부 알림 등에 대해서도 예외를 많이 사용하도록 설계되었습니다. 클라이언트가 연결이 끊어 졌거나 TIdTCPServer이 예외를 처리했거나 OnExecute 처리기 코드에서 캐치되지 않는 예외가 발생했기 때문에 TIdTCPServer이 연결이 완료되었음을 감지하면 OnDisconnect이 시작됩니다. 어떤 방법 으로든 OnDisconnect을 사용하여 필요한 정리 작업을 수행하십시오. TIdTCPServerOnDisconnect 이벤트 핸들러가 종료 된 후에 소켓을 닫습니다.

모든 것을 서버클라이언트가하는, 그들은 서로 데이터의 조각을 보냅니다

+0

괜찮습니까? 전체 소켓을 닫으려고합니까? 그냥 TIdTCPServer.Active : False? 아니면 내가해야 할 일이있어? 감사합니다 – killercode

+0

정확하게 "전체 소켓"이란 무엇입니까? 단일 클라이언트 또는 전체 서버? 개별 클라이언트를 연결 해제하려면,'TIdTCPConnection' 객체에서'Disconnect()'를 호출하면됩니다. 'Active : = False'를 설정하면 전체 서비스가 비활성화되고 연결된 클라이언트가 자동으로 연결이 끊어집니다. 'OnDisconnect'는 두 상황에서 여전히 해고 될 것입니다. –

0

난 그냥 내가 알고있는 소켓에 대해 뭔가 내부 작업 (TCP)를 추가하고 싶습니다. 서버클라이언트과 만 다르므로 어떤 클라이언트이 먼저 연결 요청을 보내지 않을 때까지 수동이되도록 수동으로 구성되어야합니다. 그러나 클라이언트이 연결을 끊으려는 경우, 즉 데이터를 보내지 않으려면 서버으로 보내야합니다. 정상적으로 연결을 닫으려면 고객이 전화로 "goodbay"라고 말하면서이 이벤트에 대한 특별한 데이터를 보낼 수 있습니다. 그러나 반드시 필요한 것은 아닙니다. 어떤 서비스 (클라이언트)에서 어떤 서비스 (서버) 로의 전화 통화를 상상해보십시오. "hello"로 대화를 시작하면 서비스 직원이 응답합니다. 실수로 전화기에서 재설정을 누르면 통화가 끊어집니다. 그러나 봉사는 여전히 그의 일을 계속합니다. 그리고 다시 전화 할 수 있습니다. 그로부터 나쁜 것은 아무것도 없습니다.

당신에 대해 신경 쓸 필요가 무엇인지 모두 안정적이고 정확한 클라이언트 및 자체 서버 작품이다. 잘못된 송수신 데이터를 확인하십시오. 클라이언트에서 필요할 때 다시 연결해보십시오. 일부 예외가 내부에 클라이언트을 던지면 강제 이벤트로 인해 현재 연결이 끊어졌을 때 필요하고 정상적인 상황으로 처리해야합니다.

다른 모든 내용은 이미 에 의해 답변되었습니다. Remy Lebeau.

관련 문제