{"id":15101898,"url":"https://github.com/luca-schlecker/swebsocket","last_synced_at":"2026-01-19T04:32:21.783Z","repository":{"id":237128578,"uuid":"772339566","full_name":"luca-schlecker/SwebSocket","owner":"luca-schlecker","description":"A Simple and Plain WebSocket Library for C#","archived":false,"fork":false,"pushed_at":"2024-05-20T19:04:25.000Z","size":94,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-10T22:35:23.619Z","etag":null,"topics":["client","csharp","easy-to-use","nuget","server","websocket","websocket-client","websocket-server"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/luca-schlecker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-15T02:01:48.000Z","updated_at":"2024-05-20T18:31:58.000Z","dependencies_parsed_at":"2024-09-20T06:00:52.959Z","dependency_job_id":null,"html_url":"https://github.com/luca-schlecker/SwebSocket","commit_stats":{"total_commits":66,"total_committers":1,"mean_commits":66.0,"dds":0.0,"last_synced_commit":"43a9e07c580d3362ea4fb16a7f9acbc8165f7232"},"previous_names":["luca-schlecker/swebsocket"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luca-schlecker%2FSwebSocket","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luca-schlecker%2FSwebSocket/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luca-schlecker%2FSwebSocket/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luca-schlecker%2FSwebSocket/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luca-schlecker","download_url":"https://codeload.github.com/luca-schlecker/SwebSocket/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247332512,"owners_count":20921852,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client","csharp","easy-to-use","nuget","server","websocket","websocket-client","websocket-server"],"created_at":"2024-09-25T18:42:51.276Z","updated_at":"2026-01-19T04:32:21.777Z","avatar_url":"https://github.com/luca-schlecker.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/luca-schlecker/SwebSocket\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/luca-schlecker/SwebSocket/main/icon.png\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003ch1 align=\"center\"\u003eSwebSocket\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.nuget.org/packages/SwebSocket\"\u003e\u003cimg src=\"https://img.shields.io/nuget/dt/SwebSocket\" alt=\"NuGet Downloads\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/luca-schlecker/SwebSocket/blob/main/LICENSE.md\"\u003e\u003cimg src=\"https://img.shields.io/github/license/luca-schlecker/SwebSocket\" alt=\"GitHub License\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.nuget.org/packages/SwebSocket\"\u003e\u003cimg src=\"https://img.shields.io/nuget/v/SwebSocket\" alt=\"NuGet Version\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nA handwritten, easy to use WebSocket Library that aims to:\n- Follow [RFC6455](https://datatracker.ietf.org/doc/html/rfc6455)\n- Be easy to use\n- Allow [Client](#client) and [Server](#server) use-cases\n- Integrate [Secure Connections](#secure-connection)\n- Be Portable (`netstandard2.1`)\n\n## Disclaimer\n\n\u003e [!WARNING]\n\u003e This is a fun-project and may contain severe errors. You should probably not use this in production.\n\n## Installation\n\nThis Library is on [NuGet](https://www.nuget.org/packages/SwebSocket) and can thus be installed in many ways, including but not limited to:\n- [Dotnet CLI](https://learn.microsoft.com/nuget/consume-packages/install-use-packages-dotnet-cli)\n- [Visual Studio NuGet Package Manager](https://learn.microsoft.com/nuget/consume-packages/install-use-packages-visual-studio)\n- [NuGet for Unity](https://github.com/GlitchEnzo/NuGetForUnity)\n\nThere are more provided on the NuGet Page.\n\n## Examples\n### Client\n#### Echo Client (Manual)\n```cs\nusing SwebSocket;\n\nvar ws = WebSocket\n    .Connect()\n    .To(\"wss://echo.websocket.org/\")\n    .Build();\n\n// Discard first message\n_ = ws.Receive();\n\nwhile (true) {\n    var line = Console.ReadLine();\n    if (line == null) break;\n    ws.Send(line);\n    var answer = ws.Receive();\n    if (answer is TextMessage text)\n        Console.WriteLine($\"Received: {text.Text}\");\n}\n```\n\n#### Echo Client (Background Poller)\n```cs\nusing SwebSocket;\n\nvar ws = WebSocket\n    .Connect()\n    .To(\"wss://echo.websocket.org/\")\n    .Build();\n\nws.OnMessage += (_, message) =\u003e {\n    if (message is TextMessage text)\n        Console.WriteLine($\"Received: {text.Text}\");\n};\n\nBackgroundMessagePoller.Poll(ws);\n\nwhile (true) {\n    var line = Console.ReadLine();\n    if (line == null) break;\n    ws.Send(line);\n}\n```\n\n\u003e [!IMPORTANT]\n\u003e The `WebSocket.OnMessage` event will (by default) **not** be raised.\n\u003e You can raise it manually by calling `WebSocket.EmitMessage(Message)` or use a Poller which will call it under the hood.\n\n### Server\n#### Echo Server (Manual)\n```cs\nusing SwebSocket;\n\nvar listener = new Listener(IPAddress.Any, 3000);\n\nwhile (true) {\n    var ws = listener.Accept();\n\n    try {\n        while (true) {\n            var message = ws.Receive();\n            ws.Send(message);\n        }\n    }\n    catch { }\n}\n```\n\n#### Echo Server (Blocking Poller)\n```cs\nusing SwebSocket;\n\nvar listener = new Listener(IPAddress.Any, 3000);\n\nwhile (true) {\n    var ws = listener.Accept();\n\n    ws.OnMessage += (_, m) =\u003e ws.Send(m);\n    new BlockingMessagePoller(ws).Poll();\n}\n```\n\n### Secure Connection\n#### Client\n```cs\nusing SwebSocket;\n\nvar listener = new Listener(IPAddress.Any, 3000)\n    .UseSsl(SslOptions.NoSsl)                // No Ssl\n    .UseSsl(SslOptions.ForServer(identity)); // X509Certificate2 as Identity\n\n// ...\n```\n#### Server\n```cs\nusing SwebSocket;\n\nvar ws = WebSocket\n    .Connect()\n    .To(\"wss://127.0.0.1/\")\n    .UseSsl(SslOptions.ForClient(\n        \"custom authority\", // The name to validate the certificate against\n        caCertificates      // X509Certificate2Collection\n    ))\n    .Build();\n\n// ...\n```\n\n## Related Projects\n- [WebSocket-Sharp](https://github.com/sta/websocket-sharp)\n- [System.Net.WebSockets](https://learn.microsoft.com/en-us/dotnet/api/system.net.websockets)\n- [Fleck](https://github.com/statianzo/Fleck)\n- [WatsonWebsocket](https://github.com/jchristn/WatsonWebsocket)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluca-schlecker%2Fswebsocket","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluca-schlecker%2Fswebsocket","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluca-schlecker%2Fswebsocket/lists"}