基于.NET 7 的 WebTransport 實現雙向通信

c348e8ecc665697d2ce70a2480df9227.gif

Web Transport 簡介

WebTransport?是一個新的 Web API,使用?HTTP/3?協議來支持雙向傳輸。它用于 Web 客戶端和 HTTP/3 服務器之間的雙向通信。它支持通過 不可靠的 Datagrams API 發送數據,也支持可靠的 Stream API 發送數據。

因為 HTTP/3 使用了基于 UDP 的 QUIC 協議,所以 Web Transport 可以在一個連接上創建多個流,而且不會相互阻塞。

WebTransport 支持三種不同類型的流量:數據報(datagrams) 以及單向流和雙向流。

WebTransport 的設計基于現代 Web 平臺基本類型(比如?Streams API)。它在很大程度上依賴于?promise,并且可以很好地與?async?和?await?配合使用。

在 .NET 7 中使用 WebTransport

WebTransport 在 .NET 7 以及以上版本可用,我們新建一個 .NET Core 的空項目,修改 csproj 文件,設置 EnablePreviewFeatures 和 RuntimeHostConfigurationOption ,如下

<Project?Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><EnablePreviewFeatures>True</EnablePreviewFeatures></PropertyGroup><ItemGroup><RuntimeHostConfigurationOption?Include="Microsoft.AspNetCore.Server.Kestrel.Experimental.WebTransportAndH3Datagrams"?Value="true"?/></ItemGroup>
</Project>

要設置 WebTransport 連接,首先需要配置 Web 主機并通過 HTTP/3 偵聽端口:

var?builder?=?WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context,?options)?=>
{//?Port?configured?for?WebTransportoptions.ListenAnyIP([SOME?PORT],?listenOptions?=>{listenOptions.UseHttps(GenerateManualCertificate());listenOptions.Protocols?=?HttpProtocols.Http1AndHttp2AndHttp3;});
});
var?app?=?builder.Build();

修改下面的代碼,接收 WebTransport 請求和會話。

app.Run(async?(context)?=>
{var?feature?=?context.Features.GetRequiredFeature<IHttpWebTransportFeature>();if?(!feature.IsWebTransportRequest){return;}var?session?=?await?feature.AcceptAsync(CancellationToken.None);?
});await?app.RunAsync();

等待 AcceptStreamAsync 方法直到接收到一個 Stream,使用 stream.Transport.Input 寫入數據,stream.Transport.Output 讀取數據。

var?stream?=?await?session.AcceptStreamAsync(CancellationToken.None);var?inputPipe?=?stream.Transport.Input;
var?outputPipe?=?stream.Transport.Output;
96ed927a0ad62efb6c396bc1c5fdb01d.png

在 JavaScript 中使用 WebTransport

傳入服務地址并創建 WebTransport 實例, transport.ready 完成,此時連接就可以使用了。

const?url?=?'https://localhost:5002';
const?transport?=?new?WebTransport(url);await?transport.ready;

連接到服務器后,可以使用 Streams API 發送和接收數據。

//?Send?two?Uint8Arrays?to?the?server.
const?stream?=?await?transport.createSendStream();
const?writer?=?stream.writable.getWriter();
const?data1?=?new?Uint8Array([65,?66,?67]);
const?data2?=?new?Uint8Array([68,?69,?70]);
writer.write(data1);
writer.write(data2);
try?{await?writer.close();console.log('All?data?has?been?sent.');
}?catch?(error)?{console.error(`An?error?occurred:?${error}`);
}

客戶端和服務端雙向通信

下面是一個具體的例子,使用 WebTransport 實現了客戶端和服務端的雙向通信。

838ce4a1fe5ad37fd7b2276ef01241cd.pngad630cec92e18e14b6be86e779b3e504.png6d32ea051317c369fc97d62ca42a7d4e.png

完成的代碼在下面的 github 地址。

https://github.com/danroth27/AspNetCoreNet7Samples/tree/main/WebTransportInteractiveSampleApp

希望對您有用!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280972.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280972.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django01: 安裝/基礎命令/設置筆記

安裝 按官網版本支持&#xff0c;現在比較適合使用1.11版本。 下載安裝命令 pip3 install django1.11.9 新建項目 django-admin startproject mysite 運行項目 python manage.py runserver 127.0.0.1:8000 運行相關 目錄介紹 mysite/ ├── manage.py # 管理文件 └…

JavaScript校驗網址

gistfile1.txt var linkUrl https://www.baidu.com if( typeof (linkUrl) ! undefined &amp;&amp; linkUrl ! ){var strRegex ^((https|http|ftp|rtsp|mms)?://) ?(([0-9a-z_!~*\().&amp;$%-]: )?[0-9a-z_!~*\().&amp;$%-])? //ftp的user (([0-9]{1,3}.)…

線上問題隨筆記錄數據庫連接池問題

修改方法 轉載于:https://www.cnblogs.com/lvgg/p/8581506.html

數據底座_體驗當今計算機的未來:通過智能底座將您的Galaxy S4變成PC

數據底座Have you ever thought that Smartphones these days are so advanced they could actually replace the PC in your everyday computing life? Today, we here at HTG will review using the Galaxy S4 with the “Smart Dock Multimedia Hub” as a PC replacement.…

如何實現 WPF 代碼查看器控件

如何實現 WPF 代碼查看器控件CodeViewer作者&#xff1a;WPFDevelopersOrg - 驚鏵原文鏈接[1]&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40&#xff1b;Visual Studio 2019;代碼展示需要使用到AvalonEdit是基于WPF的代碼顯示控件&#xff0c;…

談大數據也談人工智能 郭為告訴你一個不一樣的神州控股

毋庸置疑&#xff0c;我們深處一個數據無處不在的時代&#xff0c;也就是大數據時代。作為中國智慧城市領導者的神州數碼控股有限公司&#xff08;以下簡稱“神州控股”&#xff09;近年來也在積極布局大數據&#xff0c;不過在神州控股董事局主席郭為看來&#xff0c;神州控股…

Django02: pycharm上配置django

1.setting導入 File-->Setting-->Project-->Project Interface 2.new project 新窗口 圖片畫錯 3.調試 點擊右上角調試

vue-cli中配置sass

https://www.cnblogs.com/rainheader/p/6505366.html轉載于:https://www.cnblogs.com/aidixie/p/10213997.html

php 常用函數

用到就記下來&#xff0c;持續更新......... __call(string $func_name, array args){}public方法不存在 調用此函數 通過pg_系列函數與Postgres 數據庫交互 note: php 取得對象的某一共有屬性&#xff0c;若不存在則 查看是否有get方法(魔術方法) 若有則取get方法的返回值&am…

dropbox_來自提示框:望遠鏡激光瞄準器,Dropbox桌面和Kindle剪輯轉換

dropboxOnce a week we round up some great reader tips and share them with everyone; this week we’re looking at telescope laser sights, syncing your desktop with Dropbox, and converting your Kindle Clippings file. 每周一次&#xff0c;我們收集一些很棒的讀者…

在 EF Core 7 中實現強類型 ID

本文主要介紹 DDD 中的強類型 ID 的概念&#xff0c;及其在 EF 7 中的實現&#xff0c;以及使用 LessCode.EFCore.StronglyTypedId 這種更簡易的上手方式。背景在楊中科老師 B 站的.Net Core 視頻教程[1]其中 DDD 部分講到了強類型 ID&#xff08;Strongly-typed-id&#xff09…

如何快速打造一款高清又極速的短視頻APP?

2019獨角獸企業重金招聘Python工程師標準>>> 整個短視頻的市場規模一直在增長&#xff0c;網絡數據顯示2018年已經突破100億大關&#xff0c;在2019年預測將超過200億。縱觀行業&#xff0c;在生活資訊、美食、搞笑、游戲、美妝等領域&#xff0c;短視頻流量巨大但競…

Django03: django加入APP

使用命令在已有project創建 1.創建 在manage.py同級運行命令 python manage.py startapp app01 2.django中加入app 在settings.py里的INSTALLED_APPS加入app01.apps.App01Config, INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttype…

[面經]春季跳槽面筋總結 [2018年3月17]

春季跳槽面筋總結 人人都說金三銀四&#xff0c;由于一些個人的原因&#xff0c;博主也在今年的三月份抽空面了幾家公司&#xff0c;這里來總結下學習到的東西。 先簡單的說下博主的情況&#xff1a; 2015年7月份畢業&#xff0c;到現在加上實習可以算三年工作經驗base武漢&…

如何將Windows 10帳戶還原為本地帳戶(在Windows Store劫持它之后)

If your Windows 10 user account is currently a Microsoft account (by your choice or because you got, one way or another, roped into it) it’s easy to revert it back to a local account if you know where to look. Read on as we show you how. 如果您的Windows 1…

【譯】Dapr 是一個“10倍好”平臺 !?

譯者注在正式閱讀本文之前&#xff0c;我們有必要先了解下什么是“10 倍好”。10 倍好理論最早出自彼得蒂爾的《從 0 到 1》&#xff0c;他說一個新創企業&#xff0c;要想獲得快速成長&#xff0c;其提供的解決方案要比現有方案好 10 倍以上&#xff0c;這個好 10 倍&#xff…

04.jQuery 基本語法筆記

jQuery是什么 jQuery是一個輕量級的、兼容多瀏覽器的JavaScript庫。jQuery使用戶能夠更方便地處理HTML Document、Events、實現動畫效果、方便地進行Ajax交互&#xff0c;能夠極大地簡化JavaScript編程。它的宗旨就是&#xff1a;“Write less, do more.“ jQuery引入到HTML …

1. ReactJS基礎(開發環境搭建)

本文主要介紹通過React官方提供的create-react-app腳手架進行開發環境的搭建。 1.安裝node環境(安裝過程這里不做介紹&#xff0c;可參考其他博文) 在cmd中輸入node -v 如果可以看到相應版本號&#xff0c;說明node環境安裝成功 2.npm全局安裝create-react-app腳手架 3.cmd命令…

軟件工程(2018)第一次作業

(1) 回顧你過去將近3年的學習經歷 當初你報考的時候&#xff0c;是真正喜歡計算機這個專業嗎&#xff1f; 在高中的時候&#xff0c;我們就開設了微機課&#xff0c;當時上課的內容不僅有Microsoft word,excel,powerpoint的使用&#xff0c;還有編程的基本入門&#xff0c;當時…

“云計算+DevOps”的正確打開方式

以我們的經驗看&#xff0c;技術和工具是很重要&#xff0c;但是技術和工具本身卻不能產生價值&#xff0c;而將DevOps和云計算結合卻可以。事實上&#xff0c;云計算的特性決定了&#xff0c;云計算和DevOps勢必如影隨形&#xff0c;而云計算與DevOps的結合也正在為企業用戶提…