From 9ee271559f47b72a3eb75251a1967f368f50ad5e Mon Sep 17 00:00:00 2001 From: "Frank A. Krueger" Date: Mon, 12 Jun 2017 19:54:47 -0700 Subject: [PATCH] Connect WebSocket to correct Element --- Ooui/Client.js | 2 +- Ooui/Server.cs | 90 +++++++++++++++++++++++++++++++++------------- Samples/Program.cs | 1 - 3 files changed, 67 insertions(+), 26 deletions(-) diff --git a/Ooui/Client.js b/Ooui/Client.js index 5e047d5..6dc56cb 100644 --- a/Ooui/Client.js +++ b/Ooui/Client.js @@ -1,6 +1,6 @@ // Create WebSocket connection. -const socket = new WebSocket ("ws://localhost:8080", "ooui-1.0"); +const socket = new WebSocket ("ws://localhost:8080" + rootElementPath, "ooui-1.0"); console.log("Socket created"); diff --git a/Ooui/Server.cs b/Ooui/Server.cs index f4f51f2..c581d61 100644 --- a/Ooui/Server.cs +++ b/Ooui/Server.cs @@ -19,10 +19,10 @@ namespace Ooui static Server () { var asm = typeof(Server).Assembly; - System.Console.WriteLine("ASM = {0}", asm); - foreach (var n in asm.GetManifestResourceNames()) { - System.Console.WriteLine(" {0}", n); - } + // System.Console.WriteLine("ASM = {0}", asm); + // foreach (var n in asm.GetManifestResourceNames()) { + // System.Console.WriteLine(" {0}", n); + // } using (var s = asm.GetManifestResourceStream ("Ooui.Client.js")) { using (var r = new StreamReader (s)) { clientJsBytes = Encoding.UTF8.GetBytes (r.ReadToEnd ()); @@ -37,10 +37,26 @@ namespace Ooui public async Task RunAsync (string listenerPrefix, CancellationToken token) { - var listener = new HttpListener (); - listener.Prefixes.Add (listenerPrefix); - listener.Start (); + HttpListener listener = null; + + var started = false; + while (!started) { + try { + listener = new HttpListener (); + listener.Prefixes.Add (listenerPrefix); + listener.Start (); + started = true; + } + catch (System.Net.Sockets.SocketException ex) when + (ex.SocketErrorCode == System.Net.Sockets.SocketError.AddressAlreadyInUse) { + var wait = 5; + Console.WriteLine ($"{listenerPrefix} is in use, trying again in {wait} seconds..."); + await Task.Delay (wait * 1000); + } + } + Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine ($"Listening at {listenerPrefix}..."); + Console.ResetColor (); while (!token.IsCancellationRequested) { var listenerContext = await listener.GetContextAsync ().ConfigureAwait (false); @@ -85,9 +101,7 @@ namespace Ooui } } else if (publishedPaths.TryGetValue (path, out ctor)) { - var element = ctor (); - RegisterElement (element); - WriteElementHtml (element, response); + WriteElementHtml (path, response); } else { response.StatusCode = 404; @@ -95,18 +109,16 @@ namespace Ooui } } - void RegisterElement (Element element) - { - } - - void WriteElementHtml (Element element, HttpListenerResponse response) + void WriteElementHtml (string elementPath, HttpListenerResponse response) { response.StatusCode = 200; response.ContentType = "text/html"; response.ContentEncoding = Encoding.UTF8; var html = Encoding.UTF8.GetBytes ($@" -{element} - +{elementPath} + + + "); response.ContentLength64 = html.LongLength; using (var s = response.OutputStream) { @@ -117,20 +129,40 @@ namespace Ooui async void ProcessWebSocketRequest (HttpListenerContext listenerContext, CancellationToken token) { + var url = listenerContext.Request.Url; + var path = url.LocalPath; + + Func ctor; + if (!publishedPaths.TryGetValue (path, out ctor)) { + listenerContext.Response.StatusCode = 404; + listenerContext.Response.Close (); + return; + } + + Element element = null; + try { + element = ctor (); + } + catch (Exception ex) { + listenerContext.Response.StatusCode = 500; + listenerContext.Response.Close(); + Error ("Failed to create element", ex); + return; + } + WebSocketContext webSocketContext = null; try { webSocketContext = await listenerContext.AcceptWebSocketAsync(subProtocol: "ooui-1.0").ConfigureAwait (false); - Console.WriteLine ("Accepted WebSocket: {0}", webSocketContext); + Console.WriteLine ("WEBSOCKET {0}", listenerContext.Request.Url.LocalPath); } - catch (Exception e) { + catch (Exception ex) { listenerContext.Response.StatusCode = 500; listenerContext.Response.Close(); - Console.WriteLine ("Failed to accept WebSocket: {0}", e); + Error ("Failed to accept WebSocket", ex); return; } WebSocket webSocket = null; - try { webSocket = webSocketContext.WebSocket; @@ -163,12 +195,22 @@ namespace Ooui } } } - catch (Exception e) { - Console.WriteLine ("Exception: {0}", e); + catch (WebSocketException ex) when (ex.WebSocketErrorCode == WebSocketError.ConnectionClosedPrematurely) { + // The remote party closed the WebSocket connection without completing the close handshake. + } + catch (Exception ex) { + Error ("Failed to process web socket", ex); } finally { - webSocket?.Dispose(); + webSocket?.Dispose (); } } + + void Error (string message, Exception ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine ("{0}: {1}", message, ex); + Console.ResetColor (); + } } } diff --git a/Samples/Program.cs b/Samples/Program.cs index ea4862e..6a5cab7 100644 --- a/Samples/Program.cs +++ b/Samples/Program.cs @@ -7,7 +7,6 @@ namespace Samples { static int Main (string[] args) { - Console.WriteLine ("Hello World!"); var server = new Server (); var button = new Button(); server.Publish ("/button", button);