Is there a WebSocket client implemented for .NET?

.NetHtmlWebsocketClient

.Net Problem Overview


I would like to use WebSockets in my Windows Forms or WPF-application. Is there a .NET-control that is supporting WebSockets implemented yet? Or is there any open source project started about it?

An open source solution for a Java Client supporting WebSockets could also help me.

.Net Solutions


Solution 1 - .Net

Here's a quick first pass at porting that Java code to C#. Doesn't support SSL mode and has only been very lightly tested, but it's a start.

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

Solution 2 - .Net

Now, SuperWebSocket also includes a WebSocket client implementation SuperWebSocket Project Homepage

Other .NET client implementations include:

Solution 3 - .Net

Support for WebSockets is [coming in .NET 4.5][1]. That links also contains an example using the [System.Net.WebSockets.WebSocket][2] class.

[1]: http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097383 "coming in .NET 4.5" [2]: http://msdn.microsoft.com/en-us/library/system.net.websockets.websocket%28v=vs.110%29.aspx

Solution 4 - .Net

Kaazing.com provide a .NET client library that can access websockets. They have tutorials online at Checklist: Build Microsoft .NET JMS Clients and Checklist: Build Microsoft .NET AMQP Clients

There is a Java Websocket Client project on github.

Solution 5 - .Net

There is a client implementation: http://websocket4net.codeplex.com/!

Solution 6 - .Net

another choice: XSockets.Net, has implement server and client.

can install server by:

PM> Install-Package XSockets

or install client by:

PM> Install-Package XSockets.Client

current version is: 3.0.4

Solution 7 - .Net

Here is the list of .net supported websocket nuget packages

Websocket pakages.

I prefer following clients

  1. Alchemy websocket
  2. SocketIO

Solution 8 - .Net

it's a pretty simple protocol. there's a java implementation here that shouldn't be too difficult to translate into c#. if i get around to doing it, i'll post it up here...

Solution 9 - .Net

Recently the Interoperability Bridges and Labs Center released a prototype implementation (in managed code) of two drafts of the WebSockets protocol specification:

draft-hixie-thewebsocketprotocol-75 and draft-hixie-thewebsocketprotocol-76

The prototype can be found at HTML5 Labs. I put in this blog post all the information I found (until now) and snippets of code about how this can be done using WCF.

Solution 10 - .Net

If you'd like something a little more lightweight, check out a C# server that a friend and I released: https://github.com/Olivine-Labs/Alchemy-Websockets

Supports vanilla websockets as well as flash websockets. It was built for our online game with a focus on scalability and efficiency.

Solution 11 - .Net

There is also Alchemy. http://olivinelabs.com/Alchemy-Websockets/ which is rather cool.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJonasView Question on Stackoverflow
Solution 1 - .NetjhurlimanView Answer on Stackoverflow
Solution 2 - .NetKerry JiangView Answer on Stackoverflow
Solution 3 - .NetStephen RudolphView Answer on Stackoverflow
Solution 4 - .NetRobert ChristieView Answer on Stackoverflow
Solution 5 - .NetKerry JiangView Answer on Stackoverflow
Solution 6 - .NetsendreamsView Answer on Stackoverflow
Solution 7 - .NetshivakumarView Answer on Stackoverflow
Solution 8 - .NetbillywhizzView Answer on Stackoverflow
Solution 9 - .NetNikos BaxevanisView Answer on Stackoverflow
Solution 10 - .NetJack LawsonView Answer on Stackoverflow
Solution 11 - .NetRushinoView Answer on Stackoverflow