servidor de WebSocket: función AlAbrir en el zócalo de la tela nunca se llama
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)
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