{"id":9489,"date":"2024-10-13T18:16:35","date_gmt":"2024-10-13T09:16:35","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=9489"},"modified":"2024-10-13T18:18:00","modified_gmt":"2024-10-13T09:18:00","slug":"websocket-with-net-core","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=9489","title":{"rendered":"WebSocket with .NET Core"},"content":{"rendered":"<h1>WebSocket with .NET Core<\/h1>\n<p>.NET Core \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc11c\ubc84\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uc11c\ubc84<\/h2>\n<pre><code class=\"language-csharp\">using System.Net;\nusing System.Net.WebSockets;\nusing System.Text;\n\nvar builder = WebApplication.CreateBuilder(args);\nbuilder.WebHost.UseUrls(&quot;http:\/\/localhost:5050&quot;);\nvar app = builder.Build();\napp.UseWebSockets();\n\nvar connections = new List&lt;WebSocket&gt;();\n\napp.Map(&quot;\/ws&quot;, async context =&gt;\n{\n    if (context.WebSockets.IsWebSocketRequest)\n    {\n        var curName = context.Request.Query[&quot;name&quot;];\n\n        using var ws = await context.WebSockets.AcceptWebSocketAsync();\n\n        connections.Add(ws);\n        Console.WriteLine(&quot;Connected&quot;);\n\n        await ReceiveMessage(ws,\n            async (result, buffer) =&gt;\n            {\n                if (result.MessageType == WebSocketMessageType.Text)\n                {\n                    string message = Encoding.UTF8.GetString(buffer, 0, result.Count);\n                    Console.WriteLine(&quot;Received message : &quot; + message);\n                    await Broadcast(curName + &quot;: &quot; + message);\n                }\n                else if (result.MessageType == WebSocketMessageType.Close || ws.State == WebSocketState.Aborted)\n                {\n                    connections.Remove(ws);\n                    Console.WriteLine(&quot;Disconnected&quot;);\n                    await ws.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);\n                }\n            });\n    }\n    else\n    {\n        context.Response.StatusCode = (int)HttpStatusCode.BadRequest;\n    }\n});\nasync Task ReceiveMessage(WebSocket socket, Action&lt;WebSocketReceiveResult, byte[]&gt; handleMessage)\n{\n    var buffer = new byte[1024 * 4];\n    while (socket.State == WebSocketState.Open)\n    {\n        var result = await socket.ReceiveAsync(new ArraySegment&lt;byte&gt;(buffer), CancellationToken.None);\n        handleMessage(result, buffer);\n    }\n}\n\nasync Task Broadcast(string message)\n{\n    var bytes = Encoding.UTF8.GetBytes(message);\n    foreach (var socket in connections)\n    {\n        if (socket.State == WebSocketState.Open)\n        {\n            var arraySegment = new ArraySegment&lt;byte&gt;(bytes, 0, bytes.Length);\n            await socket.SendAsync(arraySegment, WebSocketMessageType.Text, true, CancellationToken.None);\n        }\n    }\n}\n\nawait app.RunAsync();<\/code><\/pre>\n<h2>\ud074\ub77c\uc774\uc5b8\ud2b8<\/h2>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8\ub294 JavaScript \ub85c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;ko&quot;&gt;\n&lt;head&gt;\n    &lt;meta charset=&quot;UTF-8&quot;&gt;\n    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;\n    &lt;title&gt;\uc6f9\uc18c\ucf13&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n&lt;h1&gt;\uc6f9\uc18c\ucf13 \ud14c\uc2a4\ud2b8&lt;\/h1&gt;\n\n&lt;button id=&quot;btn_send&quot;&gt;\uba54\uc2dc\uc9c0 \uc804\uc1a1&lt;\/button&gt;\n&lt;button id=&quot;btn_close&quot;&gt;\uc5f0\uacb0 \ub04a\uae30&lt;\/button&gt;\n&lt;\/body&gt;\n&lt;script&gt;\n    \/\/ ====================================================\n    \/\/ connect\n    const webSocket = new WebSocket(&quot;ws:\/\/localhost:8080\/ws&quot;);\n\n    \/\/ ====================================================\n    \/\/ on open\n    webSocket.onopen = () =&gt; {\n        console.log(&quot;\uc6f9\uc18c\ucf13\uc11c\ubc84\uc640 \uc5f0\uacb0 \uc131\uacf5&quot;);\n    };\n\n    \/\/ ====================================================\n    \/\/ receive message\n    webSocket.onmessage = function (event) {\n        console.log(`\uc11c\ubc84 \uc6f9\uc18c\ucf13\uc5d0\uac8c \ubc1b\uc740 \ub370\uc774\ud130: ${event.data}`);\n    }\n\n    \/\/ ====================================================\n    \/\/ on close\n    webSocket.onclose = function() {\n        console.log(&quot;\uc11c\ubc84 \uc6f9\uc18c\ucf13 \uc5f0\uacb0 \uc885\ub8cc&quot;);\n    }\n\n    \/\/ ====================================================\n    \/\/ on error\n    webSocket.onerror = function(event) {\n        console.log(event)\n    }\n\n    let count = 1;\n    document.getElementById(&quot;btn_send&quot;).onclick = function() {\n        if(webSocket.readyState === webSocket.OPEN) {\n            \/\/ ============================================\n            \/\/ send\n            webSocket.send(`\uc99d\uac00\ud558\ub294 \uc22b\uc790\ub97c \ubcf4\ub0c5\ub2c8\ub2e4 =&gt; ${count}`);\n            count++;\n        }else{\n            alert(&quot;\uc5f0\uacb0\ub41c \uc6f9\uc18c\ucf13 \uc11c\ubc84\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.&quot;);\n        }\n    }\n\n    document.getElementById(&quot;btn_close&quot;).onclick = function() {\n        if(webSocket.readyState === webSocket.OPEN) {\n            \/\/ ============================================\n            \/\/ close\n            webSocket.close();\n        }else{\n            alert(&quot;\uc5f0\uacb0\ub41c \uc6f9\uc18c\ucf13 \uc11c\ubc84\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.&quot;);\n        }\n    }\n&lt;\/script&gt;\n&lt;\/html&gt;<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>WebSocket with .NET Core .NET Core \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc11c\ubc84\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc11c\ubc84 using System.Net; using System.Net.WebSockets; using System.Text; var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseUrls(&quot;http:\/\/localhost:5050&quot;); var app = builder.Build(); app.UseWebSockets(); var connections = new List&lt;WebSocket&gt;(); app.Map(&quot;\/ws&quot;, async context =&gt; { if (context.WebSockets.IsWebSocketRequest) { var curName = context.Request.Query[&quot;name&quot;]; using var ws = await context.WebSockets.AcceptWebSocketAsync(); connections.Add(ws); Console.WriteLine(&quot;Connected&quot;); await ReceiveMessage(ws, async (result,\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=9489\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-9489","post","type-post","status-publish","format-standard","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/9489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9489"}],"version-history":[{"count":2,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/9489\/revisions"}],"predecessor-version":[{"id":9491,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/9489\/revisions\/9491"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}