是否有一个WebSocket客户端实现的.NET?
我想在我的Windows窗体或WPF应用程序中使用WebSockets。 是否有.NET控件支持实现的WebSockets呢? 还是有没有开源项目开始呢?
支持WebSockets的Java客户端的开源解决scheme也可以帮助我。
下面是将Java代码移植到C#的第一步。 不支持SSL模式,只是非常轻微的testing,但这是一个开始。
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); } }
现在,SuperWebSocket还包括一个WebSocket客户端实现的SuperWebSocket项目主页
其他.NET客户端实现包括:
- 微软WebSocket客户端原型
- WebSocket的夏普
- 安达
.NET 4.5支持WebSockets。 该链接还包含一个使用System.Net.WebSockets.WebSocket类的示例。
Kaazing.com提供了一个可以访问websocket的.NET客户端库。 他们在清单上有在线教程:构buildMicrosoft .NET JMS客户端和清单:构buildMicrosoft .NET AMQP客户端
在github上有一个Java Websocket Client项目。
有一个客户端实现: http : //websocket4net.codeplex.com/ !
另一个select: XSockets.Net ,实现了服务器和客户端。
可以通过以下方式安装
PM> Install-Package XSockets
或通过以下方式安装
PM> Install-Package XSockets.Client
目前的版本是: 3.0.4
这是.net支持的websocket nuget包列表
Websocket pakages 。
我更喜欢下面的客户
- 炼金术websocket
- SocketIO
这是一个非常简单的协议。 这里有一个Java实现,不应该太难以转换成C#。 如果我做到这一点,我会把它张贴在这里…
最近互操作性网桥和实验中心发布了两个WebSockets协议规范草案的原型实现(托pipe代码):
draft-hixie-thewebsocketprotocol-75和draft-hixie-thewebsocket-protocol-76
原型可以在HTML5实验室find。 我在这篇博文中发现了我发现的所有信息(直到现在)以及关于如何使用WCF完成这些代码的代码片段。
如果你想要一些更轻量级的东西,看看一个朋友和我发布的C#服务器: https : //github.com/Olivine-Labs/Alchemy-Websockets
支持香草websockets以及flash websockets。 它专为我们的在线游戏而devise,重点在于可扩展性和效率。