servidor de WebSocket: función AlAbrir en el zócalo de la tela nunca se llama

StackOverflow https://stackoverflow.com/questions/2211898

  •  18-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de implementar un servidor de C # websocket, pero su darme un par de problemas. Estoy corriendo un servidor web (ASP.NET) para alojar la página con el código JavaScript y el servidor websocket se implementa como una aplicación de consola de C #.

Soy capaz de detectar el intento de conexión desde el cliente (cromo ejecutar el javascript) y también para recuperar el apretón de manos por parte del cliente. Pero el cliente no parece aceptar el apretón de manos que estoy enviando de vuelta (la función onopen en el zócalo de la tela nunca se llama).

He estado leyendo el El zócalo Web protocolo y yo no puede ver lo que estoy haciendo mal. Aquí hay un poco de código del servidor:

Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8181);
listener.Bind(ep);
listener.Listen(100);
Console.WriteLine("Wainting for connection...");
Socket socketForClient = listener.Accept();
if (socketForClient.Connected)
{
    Console.WriteLine("Client connected");
    NetworkStream networkStream = new NetworkStream(socketForClient);
    System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
    System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream);

    //read handshake from client:
    Console.WriteLine("HANDSHAKING...");
    char[] shake = new char[255];
    streamReader.Read(shake, 0, 255);

    string handshake =
       "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +
       "Upgrade: WebSocket\r\n" +
       "Connection: Upgrade\r\n" +
       "WebSocket-Origin: http://localhost:8080\r\n" +
       "WebSocket-Location: ws://localhost:8181\r\n" +
       "\r\n";

    streamWriter.Write(handshake);
    streamWriter.Flush();

Estoy corriendo con el servidor web en el puerto 8080 y el servidor de socket web en el puerto 8181, tanto en mi localhost.

He intentado enviar el apretón de manos en diferentes codificaciones (ASCII, bytes y Hex), pero esto no parece hacer una diferencia. La conexión no se ha establecido plenamente. El Javascript se parece a esto:

var ws;
var host = 'ws://localhost:8181';
debug("Connecting to " + host + " ...");
try {
 ws = new WebSocket(host);
} catch (err) {
 debug(err, 'error');
}
ws.onopen = function () {
 debug("connected...", 'success');
};
ws.onclose = function () {
 debug("Socket closed!", 'error');
};
ws.onmessage = function (evt) {
 debug('response: ' + evt, 'response');
};

supongo que el error reside en el servidor de C # como el cromo es el envío de la información como debe ser, pero como dice la función onopen nunca es llamado.

Así que mi pregunta en pocas palabras: ¿Alguno de ustedes ha logrado esto - y si es así, ¿cómo hacerlo? Y de la causa: ¿Ha observado algunos errores aparentes en el código (esa es la esperanza de no mucho pedir)

¿Fue útil?

Solución

Probablemente se trata de un problema de codificación. He aquí un trabajo servidor de C # escribí:

class Program
{
    static void Main(string[] args)
    {
        var listener = new TcpListener(IPAddress.Loopback, 8181);
        listener.Start();
        using (var client = listener.AcceptTcpClient())
        using (var stream = client.GetStream())
        using (var reader = new StreamReader(stream))
        using (var writer = new StreamWriter(stream))
        {
            writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
            writer.WriteLine("Upgrade: WebSocket");
            writer.WriteLine("Connection: Upgrade");
            writer.WriteLine("WebSocket-Origin: http://localhost:8080");
            writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
            writer.WriteLine("");
        }
        listener.Stop();
    }
}

Y el cliente correspondiente alojado en localhost:8080:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <script type="text/javascript">
      var socket = new WebSocket('ws://localhost:8181/websession');
      socket.onopen = function() {
        alert('handshake successfully established. May send data now...');
      };
      socket.onclose = function() {
        alert('connection closed');
      };
    </script>
  </head>
  <body>
  </body>
</html>

En este ejemplo se establece solamente el apretón de manos. Usted tendrá que ajustar el servidor con el fin de seguir aceptando los datos una vez se ha establecido el apretón de manos.

Otros consejos

Utilice la codificación UTF8 para enviar mensajes de texto.

Hay un servidor de WebSocket de código abierto que se realiza mediante C #, se puede utilizar directamente.

http://superwebsocket.codeplex.com/

Es mi proyecto de código abierto!

  

El .NET Framework 4.5 introduce soporte para WebSockets de Windows   Fundación Comunicación. WebSockets es una manera eficiente, basada en estándares   La tecnología que permite la comunicación bidireccional a través de la norma   puertos HTTP 80 y 443. El uso de los puertos estándar HTTP permite   WebSockets para comunicarse a través de la web a través de intermediarios. Dos   nuevos enlaces estándar se han añadido para apoyar la comunicación a través de una   WebSocket transporte. NetHttpBinding y NetHttpsBinding.   WebSockets ajustes específicos se pueden configurar en el   elemento HttpTransportBinding mediante el acceso a los WebSocketSettings   propiedad.

Creo que todavía utiliza SOAP aunque

http://msdn.microsoft.com /en-us/library/hh674271(v=vs.110).aspx

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