websockets servidor net example ejemplo .net html5 websocket client

servidor - ¿Hay un cliente WebSocket implementado para.NET?



websocket c# javascript example (11)

Me gustaría usar WebSockets en mis formularios de Windows o en la aplicación WPF. ¿Hay algún control .NET que sea compatible con WebSockets implementado? ¿O hay algún proyecto de código abierto iniciado al respecto?

Una solución de código abierto para un cliente Java compatible con WebSockets también podría ayudarme.




Aquí hay un primer paso rápido para transferir ese código Java a C #. No es compatible con el modo SSL y solo ha sido muy poco probado, pero es un comienzo.

using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; public class WebSocket { private Uri mUrl; private TcpClient mClient; private NetworkStream mStream; private bool mHandshakeComplete; private Dictionary<string, string> mHeaders; public WebSocket(Uri url) { mUrl = url; string protocol = mUrl.Scheme; if (!protocol.Equals("ws") && !protocol.Equals("wss")) throw new ArgumentException("Unsupported protocol: " + protocol); } public void SetHeaders(Dictionary<string, string> headers) { mHeaders = headers; } public void Connect() { string host = mUrl.DnsSafeHost; string path = mUrl.PathAndQuery; string origin = "http://" + host; mClient = CreateSocket(mUrl); mStream = mClient.GetStream(); int port = ((IPEndPoint)mClient.Client.RemoteEndPoint).Port; if (port != 80) host = host + ":" + port; StringBuilder extraHeaders = new StringBuilder(); if (mHeaders != null) { foreach (KeyValuePair<string, string> header in mHeaders) extraHeaders.Append(header.Key + ": " + header.Value + "/r/n"); } string request = "GET " + path + " HTTP/1.1/r/n" + "Upgrade: WebSocket/r/n" + "Connection: Upgrade/r/n" + "Host: " + host + "/r/n" + "Origin: " + origin + "/r/n" + extraHeaders.ToString() + "/r/n"; byte[] sendBuffer = Encoding.UTF8.GetBytes(request); mStream.Write(sendBuffer, 0, sendBuffer.Length); StreamReader reader = new StreamReader(mStream); { string header = reader.ReadLine(); if (!header.Equals("HTTP/1.1 101 Web Socket Protocol Handshake")) throw new IOException("Invalid handshake response"); header = reader.ReadLine(); if (!header.Equals("Upgrade: WebSocket")) throw new IOException("Invalid handshake response"); header = reader.ReadLine(); if (!header.Equals("Connection: Upgrade")) throw new IOException("Invalid handshake response"); } mHandshakeComplete = true; } public void Send(string str) { if (!mHandshakeComplete) throw new InvalidOperationException("Handshake not complete"); byte[] sendBuffer = Encoding.UTF8.GetBytes(str); mStream.WriteByte(0x00); mStream.Write(sendBuffer, 0, sendBuffer.Length); mStream.WriteByte(0xff); mStream.Flush(); } public string Recv() { if (!mHandshakeComplete) throw new InvalidOperationException("Handshake not complete"); StringBuilder recvBuffer = new StringBuilder(); BinaryReader reader = new BinaryReader(mStream); byte b = reader.ReadByte(); if ((b & 0x80) == 0x80) { // Skip data frame int len = 0; do { b = (byte)(reader.ReadByte() & 0x7f); len += b * 128; } while ((b & 0x80) != 0x80); for (int i = 0; i < len; i++) reader.ReadByte(); } while (true) { b = reader.ReadByte(); if (b == 0xff) break; recvBuffer.Append(b); } return recvBuffer.ToString(); } public void Close() { mStream.Dispose(); mClient.Close(); mStream = null; mClient = null; } private static TcpClient CreateSocket(Uri url) { string scheme = url.Scheme; string host = url.DnsSafeHost; int port = url.Port; if (port <= 0) { if (scheme.Equals("wss")) port = 443; else if (scheme.Equals("ws")) port = 80; else throw new ArgumentException("Unsupported scheme"); } if (scheme.Equals("wss")) throw new NotImplementedException("SSL support not implemented yet"); else return new TcpClient(host, port); } }



Es un protocolo bastante simple. hay una implementación de java here que no debería ser demasiado difícil de traducir a c #. Si consigo hacerlo, lo publicaré aquí ...




Otra opción: XSockets.Net , tiene implemento servidor y cliente.

puede instalar el servidor por:

PM> Install-Package XSockets

o instalar el cliente por:

PM> Install-Package XSockets.Client

La versión actual es: 3.0.4


Recientemente, el Interoperability Bridges and Labs Center lanzó una implementación prototipo (en código administrado) de dos borradores de la especificación del protocolo WebSockets:

draft-hixie-thewebsocketprotocol-75 y draft-hixie-thewebsocketprotocol-76

El prototipo se puede encontrar en HTML5 Labs. Puse en esta publicación del blog toda la información que encontré (hasta ahora) y fragmentos de código sobre cómo se puede hacer esto usando WCF.


Si desea algo un poco más liviano, visite un servidor C # que un amigo y yo lanzamos: https://github.com/Olivine-Labs/Alchemy-Websockets

Es compatible con websockets de vainilla, así como flash websockets. Fue creado para nuestro juego en línea con un enfoque en la escalabilidad y la eficiencia.