Pregunta

Estoy intentando escribir un servidor de sondeo largo basada en TCP a medida que servirá como un intermediario para otras conexiones TCP que requieren más persistencia que un teléfono móvil puede ofrecer.

La forma en que estoy tratando de hacer que está escribiendo un servidor TCP asíncrona en C # y un cliente TCP juego también escrito en C #.

La forma en que las obras de votación largas (por lo que yo entiendo) es que se abre una conexión TCP a un servidor, y el servidor se detiene antes de enviar los datos al otro lado del zócalo. A encontrar un intervalo de latido del corazón que funciona en una red de telefonía móvil (He oído que unos 8 minutos trabaja?) Y se envía un paquete vacío si no hay datos actualizados.

Aquí es donde entra en mi problema. No puedo encontrar la manera de “enlace” petición de mi cliente para datos con un controlador de eventos que se ejecutan en el servidor ...

El flujo debe ser algo como esto ( “cliente” es en un teléfono):

  1. el usuario inicia mi solicitud

  2. El cliente envía una solicitud para ser notificado si los datos han cambiado

  3. Servidor “enlaces” (registros) objeto socket de cliente en un “gestor de eventos” que se llama por otras conexiones TCP del servidor que hablé!

  4. Evento

    o Si se desencadena (nuevos datos ha llegado), enviar los datos al cliente

    o Si no se activa (no hay nuevos datos), enviar un paquete “EmptyChanges” al cliente

  5. El cliente recibe los datos en el teléfono y lo procesa (llama a un controlador de eventos basado en el tipo de paquete que recibe y transmite los “datos” se puso desde el servidor a la misma)

  6. El cliente envía una solicitud para ser notificado si los datos han cambiado

Por lo tanto, mi problema es que no puedo pensar en un diseño que va a lograr lo que quiero que haga. El problema es que no sé cómo hacerlo # 3. ¿Cómo puedo “Enlace” manipulador de un evento de otro? Y estos son casi garantizado que se ejecutan en diferentes hilos!

Por lo tanto, mi solicitud sería algo como esto (todo 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
            {
            }
        }
    }
}

Un poco? Yo quiero que sea dirigido por eventos, pero estoy teniendo el tiempo damndest encontrar la manera de impulsar la aplicación con un estilo impulsado PUSH frente a lo que soy "usado" a de sondeo.

Por favor, sea amable como podría estar haciendo algo demasiado complicado y estúpido porque este es mi primer intento real en el uso de la programación del zócalo (nunca lo necesitaba) y es especialmente difícil debido a la naturaleza de los teléfonos celulares son en redes transitorios y mi servidor necesidad de mantener la ubicación de estos teléfonos con una conexión TCP abierta.

  

plataforma de servidor: Windows

     

lenguaje de servidor: C #

     

plataforma de cliente de prueba: Windows

     

Idioma de cliente de prueba: C #

     

plataforma de cliente de destino: Windows Mobile 6.5, iPhone, Android (clientes serán escritos por separado)

     

idioma del cliente de destino: C #, Obj-C o MonoTouch, Java

¿Fue útil?

Solución

Al igual cualquiera que se pregunte esto, destrozado la idea de escribir un servidor TCP personalizado para administrar mis conexiones. Había tanta sobrecarga en hacer eso, yo básicamente replicando escribir mi propio servidor HTTP, así que en vez de hacer eso, fui con el marco Web Tornado en Python que mi servidor y escribo los servicios de back-end para comunicarse a través de HTTP solicitudes en web tornado.

En lugar de utilizar sondeo largo del todo, voy a utilizar SMS para las notificaciones push. Creo que todas las plataformas de teléfonos importantes implementar algo similar a un interceptor de SMS que se escribe ... si un SMS de un determinado formato viene a través, se ejecutará el código personalizado. Esto me permite eliminar los requisitos de la utilización de conexiones abiertas consistentes (que no sean para chat en vivo, que utilizará un estilo cometa larga encuesta, pero la conexión sólo puede permanecer abierta si está activo durante unos 5 minutos.)

Básicamente, el marco Web Tornado es que actúa como un bus de la empresa en mi arquitectura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top