WebSocketPipe 0.9.0
dotnet add package WebSocketPipe --version 0.9.0
NuGet\Install-Package WebSocketPipe -Version 0.9.0
此命令打算在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="WebSocketPipe" Version="0.9.0" />
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以引用此包。
paket add WebSocketPipe --version 0.9.0
NuGet 团队不提供对此客户端的支持。请联系其 维护者 以获取支持。
#r "nuget: WebSocketPipe, 0.9.0"
#r 指令可以在 F# Interactive 和 Polyglot Notebooks 中使用。将此代码复制到交互式工具或脚本的源代码中以引用包。
// Install WebSocketPipe as a Cake Addin #addin nuget:?package=WebSocketPipe&version=0.9.0 // Install WebSocketPipe as a Cake Tool #tool nuget:?package=WebSocketPipe&version=0.9.0
NuGet 团队不提供对此客户端的支持。请联系其 维护者 以获取支持。
使用方法
using Devlooped.Net;
var client = new ClientWebSocket();
await client.ConnectAsync(serverUri, CancellationToken.None);
using IWebSocketPipe pipe = WebSocketPipe.Create(client, closeWhenCompleted: true);
// Start the pipe before hooking up the processing
var run = pipe.RunAsync();
IWebSocketPipe
接口扩展了 IDuplexPipe,公开了可用来读取传入消息和写入传出消息的 Input
和 Output
属性。
例如,为了读取传入数据并将其写入控制台,我们可以编写以下代码:
await ReadIncoming(pipe.Input);
async Task ReadIncoming(PipeReader reader)
{
while (await reader.ReadAsync() is var result && !result.IsCompleted)
{
Console.WriteLine($"Received: {Encoding.UTF8.GetString(result.Buffer)}");
reader.AdvanceTo(result.Buffer.End);
}
Console.WriteLine($"Done reading.");
}
同样,为了将控制台输入写入底层 WebSocket,我们使用类似以下代码:
await SendOutgoing(pipe.Output);
async Task SendOutgoing(PipeWriter writer)
{
while (Console.ReadLine() is var line && line?.Length > 0)
{
Encoding.UTF8.GetBytes(line, writer);
}
await writer.CompleteAsync();
Console.WriteLine($"Done writing.");
}
如果我们想要同时读取和写入,并等待这两个操作完成,只需等待这两个任务:
// Wait for completion of processing code
await Task.WhenAny(
ReadIncoming(pipe.Input),
SendOutgoing(pipe.Output));
请注意,完成 PipeWriter
将自动使读者收到完成的结果并退出循环。此外,整体 IWebSocketPipe.RunAsync
任务也将运行到完成。
如果创建时将 closeWhenCompleted
设置为 true,则 IWebSocketPipe
会负责在输入或输出完成时优雅地关闭连接。
或者,也可以显式完成整个管道,同时设置可选的套接字关闭状态和状态描述,供服务器操作使用
await pipe.CompleteAsync(WebSocketCloseStatus.NormalClosure, "Done processing");
指定关闭状态将始终关闭底层套接字。
您也可以在服务器上使用它。以下示例基本上来自于 ASP.NET Core 中的 WebSocket 文档,并适当地使用 WebSocketPipe
读取/写入客户端。
app.Use(async (context, next) =>
{
if (context.Request.Path == "/ws")
{
if (context.WebSockets.IsWebSocketRequest)
{
using var websocket = await context.WebSockets.AcceptWebSocketAsync();
using var pipe = WebSocketPipe.Create(websocket, true);
await Task.WhenAll(Echo(pipe), pipe.RunAsync(context.RequestAborted));
}
else
{
context.Response.StatusCode = (int) HttpStatusCode.BadRequest;
}
}
else
{
await next();
}
});
示例 Echo
方法很简单:
async Task Echo(IDuplexPipe pipe)
{
while (await pipe.Input.ReadAsync() is var result && !result.IsCompleted)
{
// Just assume we get a single-segment entry, for simplicity
await pipe.Output.WriteAsync(result.Buffer.First);
pipe.Input.AdvanceTo(result.Buffer.End);
}
}
赞助商
产品 | 版本 兼容的以及额外的计算目标框架版本。 |
---|---|
.NET | net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
.NET Core | netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET Standard | netstandard2.1 兼容。 |
MonoAndroid | monoandroid 已计算。 |
MonoMac | monomac 已计算。 |
MonoTouch | monotouch 已计算。 |
Tizen | tizen60 已计算。 |
Xamarin.iOS | xamarinios 已计算。 |
Xamarin.Mac | xamarinmac 已计算。 |
Xamarin.TVOS | xamarintvos 已计算。 |
Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
.NETStandard 2.1
- System.IO.Pipelines (>= 5.0.1)
NuGet 包
此包没有被任何 NuGet 包使用。
GitHub 仓库
此包没有被任何流行的 GitHub 仓库使用。