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.
Ahora, SuperWebSocket también incluye una implementación de cliente WebSocket Página de inicio del proyecto SuperWebSocket
Otras implementaciones de cliente .NET incluyen:
Aquí está la lista de paquetes de nuget websocket compatibles con .net
Prefiero seguir a los clientes
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);
}
}
El soporte para WebSockets viene en .NET 4.5 . Los enlaces también contienen un ejemplo que utiliza la clase System.Net.WebSockets.WebSocket .
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í ...
Hay una implementación de cliente: websocket4net.codeplex.com !
Kaazing.com proporciona una biblioteca cliente .NET que puede acceder a websockets. Tienen tutoriales en línea en la Lista de verificación: Crear clientes de Microsoft .NET JMS y Lista de verificación: Crear clientes de Microsoft .NET AMQP
Hay un proyecto Java Websocket Client en github.
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.
También está la alquimia. http://olivinelabs.com/Alchemy-Websockets/ que es bastante bueno.