nanoFramework.System.Net.WebSockets.Server 1.1.102
前缀已保留
dotnet add package nanoFramework.System.Net.WebSockets.Server --version 1.1.102
NuGet\Install-Package nanoFramework.System.Net.WebSockets.Server -Version 1.1.102
<PackageReference Include="nanoFramework.System.Net.WebSockets.Server" Version="1.1.102" />
paket add nanoFramework.System.Net.WebSockets.Server --version 1.1.102
#r "nuget: nanoFramework.System.Net.WebSockets.Server, 1.1.102"
// Install nanoFramework.System.Net.WebSockets.Server as a Cake Addin #addin nuget:?package=nanoFramework.System.Net.WebSockets.Server&version=1.1.102 // Install nanoFramework.System.Net.WebSockets.Server as a Cake Tool #tool nuget:?package=nanoFramework.System.Net.WebSockets.Server&version=1.1.102
欢迎使用 .NET nanoFramework System.Net.WebSockets 库仓库
此 API 尽可能地反映了官方 .NET System.Net.WebSockets。异常主要来自 .NET nanoFramework 中缺乏 async
和泛型支持。
构建状态
组件 | 构建状态 | NuGet 包 |
---|---|---|
System.Net.WebSockets | ||
System.Net.WebSockets.Client | ||
System.Net.WebSockets.Server |
示例
WebSockets 服务器示例
Server.RgbSample 展示了如何使用 Websocket Server 和托管 WebApp 的 Web 服务器控制 Atom Lite ESP32 上的 RGB LED。
WebSockets 客户端示例
Client.Sample 展示了如何使用 Websocket 客户端。
WebSockets 服务器和客户端示例
ServerClient.Sample 展示了如何配置和启动 WebSocket 服务器和(ssl)客户端。
用法
这是一个.NET nanoFramework的WebSocket客户端和服务器库。WebSocket主要用于创建需要与服务器保持恒定连接的交互式Web应用。在物联网领域,一些协议(如SignalR)需要WebSocket连接。一些物联网服务器也支持或要求通过WebSocket运行某些协议,如MQTT。
客户端
连接到WebSocket服务器
要连接到WebSocket服务器,创建一个ClientWebsocket
对象。您可以在初始化时添加ClientWebSocketOptions
来设置额外的WebSocket选项。这些选项可以用来设置特定的SSL选项、更改保持活跃间隔、服务器超时以及设置最大发送和接收消息大小。您可以通过调用Connect
并传入WebSocket服务器的uri来启动连接。WebSocket位置总是以ws://
或wss://
开头。您可以使用可选的ClientWebSocketHeaders
来设置特定的头部信息。
注意:ClientWebSocketOptions.MaxFragmentSize设置了传出消息的最大包大小。当发送的消息超过最大包大小时,该消息将自动分块成较小的消息。
using System;
using System.Threading;
using System.Net.WebSockets;
using System.Net.WebSockets.WebSocketFrame;
using System.Text;
namespace NFWebsocketTestClient
{
public class Program
{
public static void Main()
{
//setup WebSocketClient
ClientWebSocket websocketClient = new ClientWebSocket(new ClientWebSocketOptions()
{
//Change the heart beat to a 30 second interval
KeepAliveInterval = TimeSpan.FromSeconds(30)
});
//Handler for receiving websocket messages
websocketClient.MessageReceived += WebsocketClient_MessageReceived;
//Setup custom header
var headers = new ClientWebSocketHeaders();
headers["userId"] = "nano";
//Connect the client to the websocket server with custom headers
websocketClient.Connect("wss://websocket.nanoFramework.net", headers);
//Send a message very 5 seconds
while(websocketClient.State == System.Net.WebSockets.WebSocketFrame.WebSocketState.Open)
{
websocketClient.SendString("Hello nanoFramework Websocket!");
Thread.Sleep(5000);
}
}
private static void WebsocketClient_MessageReceived(object sender, MessageReceivedEventArgs e)
{
var client = (ClientWebSocket)sender;
//If message is of type Text, echo message back to client
if(e.Frame.MessageType == WebSocketMessageType.Text)
{
string message = Encoding.UTF8.GetString(e.Frame.Buffer, 0, e.Frame.MessageLength);
client.SendString(message);
}
}
}
}
连接状态
可以通过检查ClientWebSocket的State
来监控连接状态。连接建立后,状态设置为Open
。如果状态为Open,客户端才能发送消息。
接收消息
可以通过设置MessageReceived
的事件处理程序来接收消息。每次收到消息时都会调用此处理程序。MesageReceivedArguments
包含包含消息的MessageReceivedFrame
。
消息帧
WebSocket的MessageReceivedFrame
支持两种类型的消息:Text
和Binary
。MessageType
属性指示接收的消息类型。EndPoint
包含消息发送者的IPEndPoint。Buffer
包含实际发送的信息。
注意:为了能够接收分片消息,用户需要实现自己的逻辑。通过检查IsFragmented,您可以确定是否在处理分片消息。Fragmentation属性标识您是否在处理消息的起始、中间或结束片段。
发送消息
可以通过调用SendString
发送文本消息,或通过调用SendBytes
使用字节数组发送二进制消息。您还可以调用Send
,它接受一个字节数组和MessageType
作为参数。
关闭连接
可以通过调用Close
来关闭连接。调用此方法将发送一个关闭消息。您可以选择指定WebSocketCloseStatus
和描述关闭原因以进行调试。每次关闭连接时都会触发Closed
事件。
服务器
WebSocketServer
是.NET nanoFramework的WebSocket主机,可以处理多个WebSocket连接。服务器可以独立运行,或与nanoFramework的HttpListener
或WebServer
集成。服务器与客户端实现共享通用的WebSocket基础。
创建服务器
要启动一个新服务器,使用可选的WebSocketServerOptions
创建一个WebsocketServer
对象。默认情况下,这将启动一个自托管的端口80服务器,通过设置Prefix
和Port
选项,您可以指定服务器侦听的端口号和前缀。默认前缀为/
。建议设置MaxClients
以确保服务器不会耗尽资源。
如果您希望托管一个与WebSocket服务器交互的Web应用,最好直接将websocket服务器与.NET nanoFramework的HttpListener
或WebServer
集成。要执行此操作,将IsStandAlone
选项设置为false
。
启动WebSocket服务器只需调用Start
。
WebSocketServer wsServer = new WebSocketServer(new WebSocketServerOptions() {
MaxClients = 10,
IsStandAlone = false
});
wsServer.MessageReceived += WsServer_MessageReceived;
wsServer.Start();
处理客户端连接
当WebSocket服务器自托管时,客户端连接会自动处理并被添加到WebSocket服务器客户端池中。您可以使用ClientsCount
来检查已连接客户端的数量。调用ListClients
将返回一个包含所有已连接客户端IP端点的数组。
当使用.NET nanoFramework的HttpListener
或WebServer时,您可以通过调用AddWebSocket
将HttpListenerContext
传递给WebSocket服务器以升级WebSocket请求。如果连接成功建立,AddWebsocket
将返回true
。
//webserver receive message event handler
private static void WebServer_CommandReceived(object obj, WebServerEventArgs e)
{
//check the path of the request
if(e.Context.Request.RawUrl == "/ws")
{
//check if this is a websocket request or a page request
if(e.Context.Request.Headers["Upgrade"] == "websocket")
{
//Upgrade to a websocket
_wsServer.AddWebSocket(e.Context);
}
}
}
处理新的连接
当客户端连接时,将调用WebsocketOpened
事件。WebserverEventArgs
包含客户端的端点。
处理连接关闭
当客户端连接关闭时,将再次调用包含在webserverEventArgs
中的端点的WebsocketClosed
事件。
关闭客户端连接
您可以调用DisconnectClient
来关闭特定的客户端连接。您需要提供要断开连接的客户端端点,并且您还需要提供适当的WebSocketCloseStatus
。
接收消息
接收消息
当来自任何客户端的消息被接收时,将引发MessageReceived
事件。有关如何处理消息,请参阅客户端部分的接收消息和消息帧。可以通过检查MessageFrame
的Endpoint
属性来识别发送消息的客户端。
发送消息
您可以通过调用SendString
(用于发送文本消息)或SendData
(用于使用字节数组发送二进制消息)来向特定客户端发送消息。您需要指定要发送消息的特定客户端EndPoint
。如果您想向所有客户端发送消息,您可以使用Broadcast
并提供字节数组或字符串。
停止服务器
您可以通过调用Stop
来停止WebSocket服务器。
反馈和文档
有关文档、提供反馈、问题以及了解如何贡献,请参阅主页存储库。
致谢
此项目的贡献者列表可在CONTRIBUTORS找到。
许可
nanoFramework类库是根据MIT许可证授权的。
行为准则
本项目采用了贡献者盟约中定义的行为准则,以明确我们社区中预期的行为。有关更多信息,请参阅.NET Foundation行为准则。
.NET基金会
本项目由.NET基金会支持。
-
- nanoFramework.CoreLibrary (>= 1.15.5)
- nanoFramework.System.Net.Http (>= 1.5.145)
NuGet 包
此包未被任何 NuGet 包使用。
GitHub 仓库 (1)
显示对 nanoFramework.System.Net.WebSockets.Server 依赖的前 1 个最受欢迎的 GitHub 仓库
仓库 | 星星 |
---|---|
nanoframework/Samples
🍬 来自 nanoFramework 团队用于测试、概念验证和其他探索性尝试的代码示例
|
版本 | 下载 | 最后更新 |
---|---|---|
1.1.102 | 55 | 7/30/2024 |
1.1.101 | 57 | 7/29/2024 |
1.1.98 | 180 | 5/13/2024 |
1.1.96 | 66 | 5/13/2024 |
1.1.94 | 86 | 5/10/2024 |
1.1.92 | 177 | 4/9/2024 |
1.1.90 | 93 | 4/8/2024 |
1.1.88 | 105 | 4/3/2024 |
1.1.86 | 104 | 4/3/2024 |
1.1.84 | 382 | 1/29/2024 |
1.1.82 | 301 | 1/26/2024 |
1.1.80 | 307 | 1/24/2024 |
1.1.78 | 315 | 1/20/2024 |
1.1.75 | 605 | 11/10/2023 |
1.1.72 | 450 | 11/9/2023 |
1.1.70 | 429 | 11/3/2023 |
1.1.68 | 532 | 10/10/2023 |
1.1.66 | 433 | 10/10/2023 |
1.1.64 | 511 | 10/4/2023 |
1.1.62 | 639 | 9/4/2023 |
1.1.60 | 564 | 9/4/2023 |
1.1.57 | 835 | 5/19/2023 |
1.1.52 | 841 | 2/17/2023 |
1.1.50 | 764 | 1/24/2023 |
1.1.48 | 815 | 12/28/2022 |
1.1.45 | 808 | 12/27/2022 |
1.1.41 | 945 | 11/23/2022 |
1.1.39 | 894 | 10/26/2022 |
1.1.37 | 832 | 10/26/2022 |
1.1.35 | 848 | 10/26/2022 |
1.1.33 | 845 | 10/25/2022 |
1.1.30 | 882 | 10/24/2022 |
1.1.28 | 874 | 10/23/2022 |
1.1.26 | 862 | 10/23/2022 |
1.1.23 | 891 | 10/10/2022 |
1.1.21 | 871 | 10/8/2022 |
1.1.19 | 891 | 10/8/2022 |
1.1.16 | 912 | 9/22/2022 |
1.1.14 | 890 | 9/22/2022 |
1.1.12 | 940 | 9/22/2022 |
1.1.10 | 910 | 9/22/2022 |
1.1.8 | 960 | 9/15/2022 |
1.1.6 | 952 | 8/5/2022 |
1.1.5 | 875 | 8/4/2022 |
1.1.4 | 870 | 8/4/2022 |
1.1.2 | 900 | 8/4/2022 |
1.0.1.25 | 1,035 | 6/13/2022 |
1.0.1.23 | 938 | 6/9/2022 |
1.0.1.21 | 881 | 6/8/2022 |
1.0.1.19 | 929 | 5/27/2022 |
1.0.1.17 | 892 | 5/26/2022 |
1.0.1.15 | 937 | 5/19/2022 |
1.0.1.13 | 921 | 5/18/2022 |
1.0.1.11 | 985 | 5/4/2022 |
1.0.1.9 | 894 | 5/3/2022 |
1.0.1 | 1,020 | 3/29/2022 |
1.0.0-preview.99 | 122 | 3/29/2022 |
1.0.0-preview.98 | 122 | 3/28/2022 |
1.0.0-preview.97 | 116 | 3/28/2022 |
1.0.0-preview.96 | 115 | 3/28/2022 |
1.0.0-preview.95 | 111 | 3/28/2022 |
1.0.0-preview.94 | 125 | 3/17/2022 |
1.0.0-preview.93 | 115 | 3/17/2022 |
1.0.0-preview.92 | 113 | 3/14/2022 |
1.0.0-preview.91 | 110 | 3/14/2022 |
1.0.0-preview.90 | 111 | 3/14/2022 |
1.0.0-preview.89 | 116 | 3/14/2022 |
1.0.0-preview.88 | 122 | 3/14/2022 |
1.0.0-preview.87 | 115 | 3/14/2022 |
1.0.0-preview.86 | 106 | 3/9/2022 |
1.0.0-preview.85 | 119 | 3/5/2022 |
1.0.0-preview.84 | 114 | 3/4/2022 |
1.0.0-preview.83 | 119 | 3/3/2022 |
1.0.0-preview.82 | 121 | 3/1/2022 |
1.0.0-preview.81 | 109 | 2/25/2022 |
1.0.0-preview.80 | 124 | 2/18/2022 |
1.0.0-preview.77 | 122 | 2/17/2022 |
1.0.0-preview.75 | 138 | 2/12/2022 |
1.0.0-preview.74 | 120 | 2/7/2022 |
1.0.0-preview.73 | 125 | 2/6/2022 |
1.0.0-preview.72 | 125 | 2/5/2022 |
1.0.0-preview.71 | 137 | 2/4/2022 |
1.0.0-preview.70 | 128 | 2/4/2022 |
1.0.0-preview.69 | 127 | 1/28/2022 |
1.0.0-preview.68 | 125 | 1/28/2022 |
1.0.0-preview.67 | 126 | 1/28/2022 |
1.0.0-preview.65 | 144 | 1/21/2022 |
1.0.0-preview.64 | 126 | 1/21/2022 |
1.0.0-preview.63 | 124 | 1/21/2022 |
1.0.0-preview.62 | 140 | 1/21/2022 |
1.0.0-preview.61 | 132 | 1/21/2022 |
1.0.0-preview.60 | 128 | 1/21/2022 |
1.0.0-preview.59 | 128 | 1/15/2022 |
1.0.0-preview.58 | 133 | 1/13/2022 |
1.0.0-preview.57 | 135 | 1/13/2022 |
1.0.0-preview.52 | 138 | 1/12/2022 |
1.0.0-preview.50 | 141 | 1/6/2022 |
1.0.0-preview.48 | 125 | 12/31/2021 |
1.0.0-preview.47 | 147 | 12/20/2021 |
1.0.0-preview.40 | 150 | 12/5/2021 |
1.0.0-preview.38 | 139 | 12/2/2021 |
1.0.0-preview.36 | 141 | 12/1/2021 |
1.0.0-preview.33 | 175 | 10/27/2021 |
1.0.0-preview.26 | 185 | 6/1/2021 |
1.0.0-preview.24 | 184 | 5/24/2021 |
1.0.0-preview.20 | 156 | 4/6/2021 |