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                
#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                

Version Downloads License

使用方法

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,公开了可用来读取传入消息和写入传出消息的 InputOutput 属性。

例如,为了读取传入数据并将其写入控制台,我们可以编写以下代码:

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);
    }
}

赞助商

sponsored clariusclarius

也会在这里提到!

产品 兼容的以及额外的计算目标框架版本。
.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 已计算。
兼容目标框架
包含目标框架(在包中)
了解更多关于 目标框架.NET Standard 的信息。

NuGet 包

此包没有被任何 NuGet 包使用。

GitHub 仓库

此包没有被任何流行的 GitHub 仓库使用。

版本 下载 最后更新时间
0.9.0 1,616 10/4/2021
0.8.1 284 9/23/2021
0.8.0 317 9/22/2021