2012-02-07 16 views
11

Me gustaría ejecutar un servidor WebSocket fuera de una función de trabajador en Azure.Running Fleck (o cualquiera) servidor Websocket en Windows Azure

Esto funciona bien localmente en el emulador, pero hay un aviso de firewall de Windows la primera vez que se ejecuta el servidor de socket.

Me pregunto si alguien sabría cómo solucionar los problemas de conexión con respecto a los enchufes en Azure.

Mi aplicación servidor de socket: OnStart

var server = new WebSocketServer("ws://theappname.cloudapp.net:8080/"); 

server.Start(socket => 
{ 
    socket.OnOpen =() => 
    { 
     Trace.WriteLine("Connected to " + socket.ConnectionInfo.ClientIpAddress,"Information"); 
     _sockets.Add(socket); 
    }; 
}); 
.... etc 

La implementación del cliente:

var socket = new WebSocket("ws://theappname.cloudapp.net:8080"); 

socket.onopen = function() { 
    status.html("Connection Opened"); 
}; 
socket.onclose = function() { 
    status.html("Connection Closed"); 
} 

El estado cambia a closed unos segundos después de cargar la página.


Mi punto final para el papel del trabajador a continuación:

WebSocket Input http 8080 <Not Set>


Ahora he tratado de obligar a la dirección IP interna utilizando la siguiente:

RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["WebSocket"].IPEndpoint.ToString();


SOLUCIÓN

Por el bien de cualquier otra persona que enfrenta esto al implementar websockets en Azure;

  1. Es posible que su firewall denegará su conexión si no está en el puerto 80 u 8080, por lo que debe crear una implementación separada para él.

  2. El punto extremo debe establecerse en TCP y no HTTP para que se creen las reglas de firewall correctas. (Ver imagen)

Endpoint Configuration

+2

Solo por el bien de la prueba, ¿por qué no cambias tu Input Endpoit del protocolo "http" al "tcp"? Y establezca explícitamente el puerto local en 8080 (que en su caso es ). También debe tener en cuenta que Windows Azure Load Balancer mataría cualquier conexión que esté inactiva durante más de 60 segundos. – astaykov

+0

@astaykov - Su comentario dio lugar a la solución, publique a continuación para que pueda + acreditarlo. Gracias. – f0x

+0

@astaykov ¿Tiene su implementación completa?Estoy tratando de hacer que la mía funcione y nunca he hecho esto antes. – Yecats

Respuesta

8

Solo por el bien de la prueba, ¿por qué no cambias tu Input Endpoit del protocolo "http" al "tcp"? Y establezca explícitamente el puerto local en 8080 (que en su caso es). También debe tener en cuenta que Windows Azure Load Balancer eliminaría cualquier conexión que esté inactiva durante más de 60 segundos, por lo que es posible que desee implementar algún tipo de solución de "ping" para mantener la conexión abierta.

+0

Gracias por los comentarios adicionales sobre cómo mantener la conexión abierta, estaba considerando algo similar. – f0x

+0

¡Me alegro de poder ayudar! – astaykov

+0

¿La conexión no se mantiene abierta enviando PING por el protocolo en sí? El protocolo –

0

Es posible que desee echar un vistazo a este vídeo de introducción que Steve Marx (@smarx) poner juntos en how to run node.js on Windows Azure.

+0

Gracias, he trabajado extensamente con node.js y socket.io; desafortunadamente este no es el contexto con el que me presentan. – f0x

Cuestiones relacionadas