Asp.Net Core中WebSocket綁定的方法詳解
說明
Websocket是html5后的產(chǎn)物,對于asp.net core中也得到了支持,Asp.Net Core中WebScoket的操作使用基本上和Asp.net中相同,不同的是,綁定監(jiān)聽。
Asp.Net Core2.0默認已經(jīng)支持WebSocket,不需要另外安裝Nuget包。
通過對HttpContext中的WebSockets.AcceptWebSocketAsync方法,接受WebSocket請求;并返回WebScoket對象。
下面話不多說了,來一起看看詳細的介紹吧。
一、示例1,
1.后臺啟動文件Startup的configure中綁定WebSocket的路由監(jiān)聽
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider svp)
{
......
//綁定WebSocket
app.Map("/wsone/Connect", (con) =>
{
con.UseWebSockets();
WSHanleTwo _two = new WSHanleTwo();
con.Use(_two.Connect);
});
}
2.定義請求處理類
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
namespace Core_Razor_2
{
public class WSHanleTwo
{
private WebSocket socket = null;
//創(chuàng)建鏈接
public async Task Connect(HttpContext context, Func<Task> n)
{
try
{
//執(zhí)行接收
WebSocket socket = await context.WebSockets.AcceptWebSocketAsync();
this.socket = socket;
//執(zhí)行監(jiān)聽
await EchoLoop();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 響應(yīng)處理
/// </summary>
/// <returns></returns>
async Task EchoLoop()
{
var buffer = new byte[1024];
var seg = new ArraySegment<byte>(buffer);
while (this.socket.State == WebSocketState.Open)
{
var incoming = await this.socket.ReceiveAsync(seg, CancellationToken.None);
byte[] backInfo = System.Text.UTF8Encoding.Default.GetBytes("服務(wù)端相應(yīng)內(nèi)容");
var outgoing = new ArraySegment<byte>(backInfo, 0, incoming.Count);
await this.socket.SendAsync(outgoing, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
}
}
3.前臺請求代碼
var socket;
//var uri = "ws://" + window.location.host + "/ws";
var uri = "ws://" + window.location.host + "@Url.Action("Connect")";
var output;
var text = "test echo";
function write(s) {
var p = document.createElement("p");
p.innerHTML = s;
output.appendChild(p);
}
function doConnect() {
socket = new WebSocket(uri);
socket.onopen = function (e) { write("opened " + uri); doSend(); };
socket.onclose = function (e) { write("closed"); };
socket.onmessage = function (e) { write("Received: " + e.data); socket.close(); };
socket.onerror = function (e) { write("Error: " + e.data); };
}
function doSend() {
write("Sending: " + text);
socket.send(text);
}
function onInit() {
output = document.getElementById("output");
doConnect();
}
window.onload = onInit;
二、為了簡單綁定,可以這樣封裝
public class SocketHandler
{
public const int BufferSize = 4096;
WebSocket socket;
SocketHandler(WebSocket socket)
{
this.socket = socket;
}
async Task EchoLoop()
{
var buffer = new byte[BufferSize];
var seg = new ArraySegment<byte>(buffer);
while (this.socket.State == WebSocketState.Open)
{
var incoming = await this.socket.ReceiveAsync(seg, CancellationToken.None);
var outgoing = new ArraySegment<byte>(buffer, 0, incoming.Count);
await this.socket.SendAsync(outgoing, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
static async Task Acceptor(HttpContext hc, Func<Task> n)
{
if (!hc.WebSockets.IsWebSocketRequest)
return;
var socket = await hc.WebSockets.AcceptWebSocketAsync();
var h = new SocketHandler(socket);
await h.EchoLoop();
}
/// <summary>
/// 路由綁定處理
/// </summary>
/// <param name="app"></param>
public static void Map(IApplicationBuilder app)
{
app.UseWebSockets();
app.Use(SocketHandler.Acceptor);
}
}
路由綁定:
[csharp] view plain copy
//綁定websocket
app.Map("/ws", SocketHandler.Map);
Asp.Net Core上傳控件:http://xiazai.jb51.net/201712/yuanma/Uploader(jb51.net).rar
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
ASP.NET動態(tài)增加HTML元素的方法實例小結(jié)
這篇文章主要介紹了ASP.NET動態(tài)增加HTML元素的方法,結(jié)合實例形式總結(jié)分析了asp.net針對樣式、Meta、js等元素動態(tài)增加相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
DataTable轉(zhuǎn)成字符串復(fù)制到txt文本的小例子
DataTable轉(zhuǎn)成字符串復(fù)制到txt文本的小例子,需要的朋友可以參考一下2013-03-03

