문제

저는 휴대폰이 제공할 수 있는 것보다 더 많은 지속성을 요구하는 다른 TCP 연결의 중개자 역할을 할 사용자 지정 TCP 기반 긴 폴링 서버를 작성하려고 합니다.

제가 하려는 방식은 C#으로 비동기 TCP 서버를 작성하고, 이에 상응하는 TCP 클라이언트도 C#으로 작성하는 것입니다.

(내가 이해하는 한) 긴 폴링이 작동하는 방식은 서버에 대한 TCP 연결을 열고 서버가 소켓을 통해 데이터를 다시 보내기 전에 정지하는 것입니다.휴대폰 네트워크에서 작동하는 하트비트 간격을 찾고(약 8분 정도라고 들었는데?) 업데이트된 데이터가 없으면 빈 패킷을 보냅니다.

이것이 내 문제가 발생하는 곳입니다.서버에서 실행되는 이벤트 핸들러를 사용하여 클라이언트의 데이터 요청을 "링크"하는 방법을 알 수 없습니다…

흐름은 다음과 같아야 합니다("클라이언트"가 전화기에 있음).

  1. 사용자가 내 애플리케이션을 시작합니다.

  2. 클라이언트는 데이터가 변경된 경우 알림을 받도록 요청을 보냅니다.

  3. 서버는 내가 이야기한 서버의 다른 TCP 연결에 의해 호출되는 "이벤트 핸들러"에 클라이언트의 소켓 개체를 "링크"(등록)합니다!

  4. 이벤트

    o 트리거되면(새 데이터 도착) 클라이언트에 데이터를 보냅니다.

    o 트리거되지 않은 경우(새 데이터 없음) 클라이언트에 "EmptyChanges" 패킷을 보냅니다.

  5. 클라이언트는 전화기에서 데이터를 수신하고 처리합니다(수신한 패킷 유형에 따라 이벤트 핸들러를 호출하고 서버에서 얻은 "데이터"를 서버에 전달).

  6. 클라이언트는 데이터가 변경된 경우 알림을 받도록 요청을 보냅니다.

그래서 내 문제는 내가 원하는 것을 성취할 수 있는 디자인이 생각나지 않는다는 것이다.문제는 #3을 어떻게 해야할지 모른다는 것입니다.한 이벤트 핸들러를 다른 이벤트 핸들러와 "링크"하려면 어떻게 해야 합니까?그리고 이것들은 다른 스레드에서 실행되는 것이 거의 보장됩니다!

따라서 내 애플리케이션은 다음과 같습니다(모두 유사 코드).

Class AppClass
{
    Main()

    List<Client> clients;
    List<DataServers> dataServers;

    DataReceivedFromServer(Data stuff)
    {
    }

    MessageReceivedFromPhone(PhoneMessage pm, object sender)
    {
        //Loop here until HeartBeat interval reached
        Int totalTime = 0;
        While(totalTime < HEARTBEAT_INTERVAL)
        {
            If( ) // If we have received data from the server, and the client WANTED that data, send it now
            {
            }
        }
    }
}

거의?이벤트 중심이 되기를 원하지만 PUSH 중심 스타일과 PUSH 중심 스타일로 애플리케이션을 구동하는 방법을 파악하는 데 가장 시간이 많이 걸립니다.내가 여론 조사에 "익숙한" 것.

소켓 프로그래밍을 사용하는 첫 번째 실제 시도(절대 필요하지 않음)이고 과도하게 복잡하고 어리석은 일을 하고 있을 수 있으므로 친절하게 대해주세요. 임시 네트워크에 있는 휴대폰의 특성과 서버가 필요하기 때문에 특히 어렵습니다. OPEN TCP 연결을 통해 이러한 전화기의 위치를 ​​유지합니다.

서버 플랫폼:윈도우

서버 언어:씨#

테스트 클라이언트 플랫폼:윈도우

테스트 클라이언트 언어:씨#

대상 클라이언트 플랫폼:Windows Mobile 6.5, iPhone, Android (클라이언트는 별도로 작성됩니다)

대상 클라이언트 언어:C#, Obj-C 또는 MonoTouch, 자바

도움이 되었습니까?

해결책

이것을 궁금해하는 사람이 있으면 연결을 관리하기 위해 사용자 정의 TCP 서버를 작성한다는 아이디어를 폐기했습니다.그렇게 하는 데 오버헤드가 너무 많았기 때문에 기본적으로 자체 HTTP 서버 작성을 복제하게 되었기 때문에 그렇게 하는 대신 Python의 Web Tornado 프레임워크를 내 서버로 사용하고 HTTP를 통해 통신하기 위한 백엔드 서비스를 작성하고 있습니다. 웹 토네이도의 요청.

Long Polling을 전혀 사용하지 않고 SMS를 사용하여 푸시 알림을 보내겠습니다.나는 모든 주요 전화 플랫폼이 당신이 작성한 SMS 인터셉터와 유사한 것을 구현한다고 믿습니다.특정 형식의 SMS가 수신되면 사용자 지정 코드가 실행됩니다.이를 통해 일관된 개방형 연결 사용에 대한 요구 사항을 제거할 수 있습니다(혜성 스타일의 긴 폴링을 사용하는 라이브 채팅 제외, 연결은 약 5분 동안 활성화된 경우에만 열려 있을 수 있음).

기본적으로 Web Tornado 프레임워크는 내 아키텍처에서 엔터프라이즈 버스 역할을 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top