Pergunta

Eu estou tentando escrever um servidor longo de votação com base personalizado TCP, que servirá como um intermediário para outras conexões TCP que exigem mais persistência do que um telemóvel pode proporcionar.

A maneira que eu estou tentando fazer é escrever um servidor TCP assíncrona em C # e uma correspondência TCP Cliente também escrito em C #.

A maneira que as obras de votação longos (tanto quanto eu entendo) é que você abrir uma conexão TCP para um servidor, e pára de servidor antes de enviar dados de volta através do soquete. Você encontra um intervalo de pulsação que funciona em uma rede de telefonia móvel (Ouvi dizer que cerca de 8 minutos trabalhos?) E você enviar um pacote vazia se não há dados atualizados.

Este é o lugar onde meu problema vem. Eu não consigo descobrir como “link” pedido do meu cliente para dados com um manipulador de eventos em execução no servidor ...

O fluxo deve ser algo como isto ( “cliente” é em um telefone):

  1. Usuário começa a minha candidatura

  2. O cliente envia um pedido para ser notificado se os dados foram alterados

  3. Servidor “links” (registros) objeto de soquete do cliente em um “manipulador de eventos” que é chamado por outras conexões TCP do servidor que falei!

  4. Event

    Se o que ele é acionado (novos dados chegou), enviar os dados para o cliente

    o Se não é acionado (sem dados novo), enviar um pacote “EmptyChanges” para o cliente

  5. Cliente recebe dados no telefone e processos que ele (chamadas um manipulador de eventos com base em que tipo de pacote recebido e passa os “dados” que recebeu do servidor a ele)

  6. O cliente envia um pedido para ser notificado se os dados foram alterados

Então, o meu problema é que eu não consigo pensar em um projeto que vai conseguir o que eu quero que ele faça. O problema é que eu não sei como fazer # 3. Como faço para manipulador de eventos um “Link” de outro? E estes são quase garantida para estar em execução em diferentes threads!

Então, o meu pedido seria algo parecido com isto (todos psuedocode):

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
            {
            }
        }
    }
}

Kind of? Eu quero que seja orientado a eventos, mas eu estou tendo o tempo damndest descobrir como conduzir o aplicativo com um impulsionada IMPULSO vs. estilo que eu estou "usado" para de Polling.

Por favor, ser gentil como eu poderia estar fazendo algo muito complicado e estúpido, porque esta é a minha primeira tentativa real de uso de programação Socket (nunca necessário) e é especialmente difícil devido à natureza de telefones celulares sendo em redes transitórios e minha servidor a necessidade de manter a localização destes telefones com uma conexão aberta TCP.

plataforma de servidor: Windows

Idioma do Servidor: C #

Test plataforma Cliente: Windows

Idioma de teste Cliente: C #

Plataforma de destino Cliente: Windows Mobile 6.5, iPhone, Android (clientes será escrito em separado)

Alvo idioma do cliente: C #, Obj-C ou MonoTouch, Java

Foi útil?

Solução

Apenas quem se perguntando isso, eu destruiu a idéia de escrever um servidor TCP personalizado para gerenciar minhas conexões. Havia tanta sobrecarga em fazer isso, eu basicamente ser replicar escrever meu próprio servidor HTTP, então ao invés de fazer isso, eu fui com o framework Web Tornado em Python como o meu servidor e estou escrevendo os serviços de back-end para se comunicar através de HTTP pedidos em web Tornado.

Em vez de usar longo polling em tudo, eu vou usar SMS para notificações push. Eu acredito que todas as principais plataformas de telefonia implementar algo semelhante a um Interceptor SMS que você escrever ... se um SMS de um determinado formato vem através, ele irá executar o seu código personalizado. Isso me permite remover os requisitos de utilização de conexões abertas consistentes (exceto para chat ao vivo, que usará um estilo cometa longa sondagem, mas a ligação só pode permanecer aberta se ativa por cerca de 5 minutos).

Basicamente, a estrutura da Web Tornado está servindo como um ônibus da empresa na minha arquitetura.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top