Serveur Websocket: la fonction onopen sur le socket Web n’est jamais appelée

J’essaie d’implémenter un serveur web C #, mais cela me pose quelques problèmes. J’exécute un serveur Web (ASP.NET) pour héberger la page avec le javascript et le serveur de socket Web est implémenté en tant qu’application de console C #.

Je suis capable de détecter la tentative de connexion à partir du client (chrome exécutant le javascript) et aussi de récupérer le handshake du client. Mais le client ne semble pas accepter la poignée de main que je vous renvoie (la fonction onopen sur le socket Web n’est jamais appelée).

J’ai lu le protocole The Web Socket et je ne vois pas ce que je fais mal. Voici un peu du code du serveur:

 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); ssortingng 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(); 

J’exécute sur le serveur Web sur le port 8080 et le serveur de socket Web sur le port 8181, les deux sur mon hôte local.

J’ai essayé d’envoyer le handshake dans différents encodages (ASCII, octets et hex), mais cela ne semble pas faire de différence. La connexion n’est jamais complètement établie. Le javascript ressemble à ceci:

 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'); }; 

Je suppose que l’erreur réside dans le serveur C # car chrome envoie les informations comme il se doit, mais la fonction onopen n’est jamais appelée.

Bref, ma question est la suivante: est-ce que l’un d’entre vous a déjà accompli cela – et si oui, comment l’avez-vous fait? Et de cause: Voyez-vous des erreurs apparentes dans le code (espérons que ce n’est pas trop demander)

C’est probablement un problème de codage. Voici un serveur C # fonctionnel que j’ai écrit:

 class Program { static void Main(ssortingng[] 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(); } } 

Et le client correspondant hébergé sur localhost:8080 :

         

Cet exemple n’établit que la poignée de main. Vous devrez modifier le serveur afin de continuer à accepter les données une fois la liaison établie.

Veuillez utiliser le codage UTF8 pour envoyer un message texte.

Il existe un serveur websocket open source implémenté par C #, vous pouvez l’utiliser directement.

http://superwebsocket.codeplex.com/

C’est mon projet open source!

Le .NET Framework 4.5 introduit la prise en charge de WebSockets dans Windows Communication Foundation. WebSockets est une technologie efficace basée sur des normes qui permet une communication bidirectionnelle sur les ports HTTP standard 80 et 443. L’utilisation des ports HTTP standard permet à WebSockets de communiquer via le Web via des intermédiaires. Deux nouvelles liaisons standard ont été ajoutées pour prendre en charge la communication via un transport WebSocket. NetHttpBinding et NetHttpsBinding. Les parameters spécifiques à WebSockets peuvent être configurés sur l’élément HttpTransportBinding en accédant à la propriété WebSocketSettings.

Je pense qu’il utilise encore SOAP si

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