Estoy tratando de implementar un servidor de socket web C#, pero me da algunos problemas. Estoy ejecutando un servidor web (ASP.NET) para alojar la página con javascript y el servidor de socket web está implementado como una aplicación de consola C#.servidor Websocket: la función onopen en el socket web nunca se llama
Soy capaz de detectar el intento de conexión del cliente (Chrome ejecutando el javascript) y también para recuperar el protocolo de enlace del cliente. Pero el cliente no parece aceptar el saludo de manos que estoy enviando (nunca se llama a la función onopen
en el socket web).
He estado leyendo The Web Socket protocol y no puedo ver lo que estoy haciendo mal. Heres un poco del 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 protocolo de enlace en diferentes codificaciones (ASCII, bytes y Hex) pero esto no parece marcar la diferencia. La conexión nunca está completamente establecida. 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 resumen: Alguno de ustedes ha logrado esto - y si es así, ¿cómo lo hicieron? Y de la causa: ¿Ve algún error aparente en el código (espero que no sea mucho pedir)
Es posible que desee utilizar Fleck, disponible en NuGet: http://nuget.org/packages/Fleck/ –