servidor - websocket server c#
Servidor Websocket: la funciĆ³n onopen en el socket web nunca se llama (3)
.NET Framework 4.5 introduce soporte para WebSockets en Windows Communication Foundation. WebSockets es una tecnología eficiente basada en estándares que permite la comunicación bidireccional a través de los puertos HTTP estándar 80 y 443. El uso de los puertos HTTP estándar permite a WebSockets comunicarse a través de la web a través de intermediarios. Se han agregado dos nuevos enlaces estándar para admitir la comunicación a través de un transporte WebSocket. NetHttpBinding y NetHttpsBinding. La configuración específica de WebSockets se puede configurar en el elemento HttpTransportBinding accediendo a la propiedad WebSocketSettings.
Creo que todavía usa SOAP aunque
http://msdn.microsoft.com/en-us/library/hh674271(v=vs.110).aspx
Estoy intentando 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 #.
Puedo 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 el protocolo The Web Socket y no puedo ver lo que estoy haciendo mal. Aquí hay 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();
Me estoy ejecutando en el servidor web en el puerto 8080 y en el servidor de socket web en el puerto 8181, ambos en mi servidor local.
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 ve así:
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 C #, ya que Chrome está enviando la información como debería, pero como dicho, nunca se llama a la función onopen
.
Entonces mi pregunta en resumen: ¿Alguno de ustedes ha logrado esto? Y si es así, ¿cómo lo hicieron? Y de la causa: ¿Ves algún error aparente en el código (espero que no sea mucho pedir)
Probablemente es un problema de codificación. Aquí hay un servidor de C # que 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>
Este ejemplo solo establece el apretón de manos. Tendrá que ajustar el servidor para continuar aceptando datos una vez que se haya establecido el protocolo de enlace.
Utilice la codificación UTF8 para enviar mensajes de texto.
Hay un servidor de websocket de código abierto implementado por C #, puede usarlo directamente.
http://superwebsocket.codeplex.com/
¡Es mi proyecto de código abierto!