2017-10-19 2 views
1

tcp 통신을 시도하면 서버가 소켓을 통해 x 초마다 메시지를 보내고 클라이언트가 특정 조건에서 메시지를 보내는 것을 중지해야합니다. 5 초 동안 아무 메시지도 보내지 않습니다. 더 자세히 설명하기 위해 클라이언트는 위에서 설명한 것과 동일한 소켓의 서버에서 모두 무시되는 상수 메시지를 보내고 알 수없는 시간에 메시지를 보내는 것을 중지 할 수 있습니다. 메시지는 단순화를 위해 살아있는 메시지로 사용되어 통신이 여전히 관련이 있다고 서버에 알립니다.tcp 클라이언트가 5 초 이상 활동하지 않을 때 감지

문제는 서버에서 반복되는 메시지를 보내려는 경우 "사용량이 많음"을 허용하지 않고 메시지 수신을 시작할 수 없으므로 새 메시지가 다른 쪽에서 도착하여 그에 따라 작동하는 것을 감지 할 수 없다는 것입니다. .

이 문제는 프로그래밍 언어와는 관련이 없지만 Python을 사용하여 더욱 구체적이고 클라이언트 코드에 액세스 할 수 없습니다.

단일 소켓에서 동시에 메시지를 보내고 보내는 옵션이 있습니까?

감사합니다.

답변

0

옵션 1

를 사용하여 두 개의 스레드가 하나의 소켓에 쓸 것이고, 두 번째는 그것에서 읽습니다.

소켓은 전이중 (양방향 동시 액세스 허용)이기 때문에 작동합니다.

옵션 2

는 모든 select.epoll를 사용하여 유지 기능 관리하는 단일 스레드를 사용합니다. 이렇게하면 한 스레드가 여러 클라이언트를 처리 할 수 ​​있습니다. 소켓을 사용하는 유일한 스레드가 아니라면 스레드 안전을 스스로 처리해야 할 수도 있습니다.

0

다른 대답에서 설명한 것처럼 스레드는 일반적인 접근 방법 중 하나입니다. 다른 방법은 이벤트 루프와 논 블로킹 I/O를 사용하는 것입니다. 최근 버전의 Python (필자는 3.4부터 시작했다)에는 이것을 지원하는 asyncio이라는 패키지가 포함되어있다.

event_loop에서 create_connection 메서드를 호출하여 asyncio 연결을 만들 수 있습니다. TCP를 읽고 쓰는 간단한 서버에 대해서는 this example을 참조하십시오.

많은 경우 이벤트 루프가 스레드보다 높은 성능을 허용 할 수 있지만 대부분의 또는 모든 코드가 이벤트 모델을 인식해야하는 단점이 있습니다.

관련 문제