Try WebSocketServer csharp 
Tags: csharp
Published: 2020-01-15 04:02:38

# Introduction
* Tried to implement a WebSocket server using C # and send push notifications to the browser.
* Don't use IIS and use System.Net.WebSockets to implement.
* Referred to [MSDN Articles](https://msdn.microsoft.com/ja-jp/magazine/jj863133.aspx?f=255&MSPPError=-2147217396)

# Server Source

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace WebSocketServerSample02
{
    class Program
    {
        static void Main(string[] args)
        {
            Run();
            Console.ReadKey();
        }

        static async Task Run()
        {
            HttpListener s = new HttpListener();
            s.Prefixes.Add("http://IPアドレス:ポート番号/");
            s.Start();
            Console.WriteLine("サーバ起動");

            var hc = await s.GetContextAsync();
            if (!hc.Request.IsWebSocketRequest)
            {
                hc.Response.StatusCode = 400;
                hc.Response.Close();
                return;
            }
            var wsc = await hc.AcceptWebSocketAsync(null);
            var ws = wsc.WebSocket;
            for (int i = 0; i != 5; ++i)
            {
                await Task.Delay(2000);
                var response = "push_event " + DateTime.Now.ToLongTimeString();
                var buffer = Encoding.UTF8.GetBytes(response);
                var segment = new ArraySegment<byte>(buffer);
                await ws.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None);
            }
            await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Done", CancellationToken.None);
        }
    }
}
```

* Start HTTP server using HttpListener.
* Wait for WebSocket connection receive request with GetContextAsync().
* Refer to Request.IsWebSocketRequest and return status code 400 if not WebSocket connection.
* Enable WebSocket connection with AcceptWebSocketAsync(null).


## Send to client

```csharp
            var ws = wsc.WebSocket;
            for (int i = 0; i != 5; ++i)
            {
                await Task.Delay(2000);
                var response = "push_event " + DateTime.Now.ToLongTimeString();
                var buffer = Encoding.UTF8.GetBytes(response);
                var segment = new ArraySegment<byte>(buffer);
                await ws.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None);
            }
            await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Done", CancellationToken.None);
```

* Store the value of "push_event current time" to the client in response.
* Send to client with SendAsync.


# Client Source
* WebSocket.onmessage processing operates when data comes from the server.

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WebSocketClient</title>
<script src="js/jquery-1.11.3.js"></script>
<script type="text/javascript">
	var webSocket;
	window.onload = function() {
		url = "http://IPアドレス:ポート番号/";
		webSocket = new WebSocket(url.replace("http://", "ws://").replace("https://", "wss://"));
		var messageArea = document.getElementById("messageArea");
		var appendMessage = function(value, color) {
			var messageElement = document.createElement("div");
			messageElement.style.color = color;
			messageElement.innerText = value;
			messageArea.insertBefore(messageElement, messageArea.firstChild);
		}
		webSocket.onopen = function() {
			appendMessage("Opened", "blue");
		}
		webSocket.onclose = function() {
			appendMessage("Closed", "red");
		}
		webSocket.onmessage = function(message) {
			var data = message.data;
			alert(data);
			appendMessage(data, "black");
		}
		webSocket.onerror = function(message) {
			appendMessage(message, "red");
		}
	}
</script>
</head>
<body>
    <div id="messageArea"></div>
</body>
</html
```