.NET-Core Series

What Is WebSocket?

WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议,是建立在TCP上、且独立的协议。在WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就可以进行持久性的连接,并进行双向数据传输。

  为了建立WebSocket 连接,浏览器 通过 Http 1.1 协议的101 StatusCode 进行握手。

 以下是我本地的一个WebSocket 握手请求的例子:

Client Request:

GET ws://localhost:62713/ws HTTP/1.1
Host: localhost:62713
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://localhost:62713
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36
DNT: 1
Accept-Encoding: gzip, deflate, br
Accept-Language: en,zh-CN;q=0.8,zh;q=0.6,zh-TW;q=0.4
Sec-WebSocket-Key: aXo04R8eiNAZOIO1WJqXEQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

Server Response:

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Date: Fri, 15 Sep 2017 03:10:05 GMT
Server: Kestrel
Upgrade: websocket
Sec-WebSocket-Accept: gmzB2zS5RSQhQT9LFZXZczHMjKQ=

一些关键字段的说明,

  • Connection 必须设置为 Upgrade,表示客户端希望连接升级。
  • Upgrade 字段必须设置 Websocket,表示希望升级到 Websocket 协议。
  • Sec-WebSocket-Key: 是一个 Base 64 Encode 的值,服务端会用这些数据来构造出一个SHA-1 的信息摘要。之后进行 Base-64 编码,将结果作为 Sec-WebSocket-Accept 头的值,返回给客户端。

关键词: 持久连接,持久化协议,全双工

What Is This Article About?

 这篇文章你会了解到的是 WebSocket 在.NET-Core 中的一些基础实现和实践,首先先以官方给出的WebSocket入门,然后再构建WebSocket中间件,最后会用WebSocket 来实现一个实时聊天的小Demo。

Use WebSockets In ASP.NET Core

A Simple Explaination For Official Demo

 首先以官方给出的WebSocket的例子入门,大致介绍一下。效果图大概就是下面这样的。

就是我发什么信息,服务器就实时回复我什么信息。主要代码如下:首先要接受

// Configure function
///Summary
// 这里主要是监听 WebSocket的请求,然后Invoke Echo 方法进行相关操作。比如,它接受到浏览器发来 WebSocket 的Close 命令了,那么在Echo 方法直接 await webSocket.CloseAsync(result.CloseStatus.Value... 相关操作
///Summary
app.Use(async (context, next) =>
{
if (context.Request.Path == "/ws")
{
if (context.WebSockets.IsWebSocketRequest)
{
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
await Echo(context, webSocket);
}
else
{
context.Response.StatusCode = 400;
}
}
}); //Echo function
private async Task Echo(HttpContext context, WebSocket webSocket)
{
var buffer = new byte[1024 * 4];
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue)
{
await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
}
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}

前端使用 js 来发送WebSocket 请求,让我们来看一下当我点击 Connect 时,到底发生了什么。下面用动图来演示一下。

是不是很熟悉,首先通过Http 发送101 ,转换协议,然后就进行WebSocket 通信了。因为在前面已经介绍过了WebSocket的工作原理了。

如果把Echo 方法中 Send 方法的 buffer修改,你就可以自己设定想要的回馈,

var abuffer = Encoding.ASCII.GetBytes("Hola, This is robert from cnblogs.");
await webSocket.SendAsync(new ArraySegment<byte>(abuffer, 0, abuffer.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(abuffer), CancellationToken.None);

结果就如下图所示这样:

官方的例子讲解就到这里了。可以自己动手实践一下。接下来讲解如何基于上述的例子我们来构建一个在线实时聊天系统。

Building Real-Time WebSocket Demo

 效果图是下面这样的,

具体怎么实现的,下篇博文介绍。

WebSocket In ASP.NET Core(一)的更多相关文章

  1. WebSocket in ASP.NET Core

    一.WebSocket WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0 ...

  2. WebSocket In ASP.NET Core(二)

    WebSocket In ASP.NET Core(二) Server in ASP.NET-Core DI in ASP.NET-Core Routing in ASP.NET-Core Error ...

  3. asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅

    一.概述 在asp.net core 中可以用WebSocket 或asp.net core SignalR来开发即时通迅.在项目中由于开发前后端分离,对于SignalR前端技术人员不想依赖juqer ...

  4. 使用websocket连接(对接)asp.net core signalr

    使用通用websocket连接asp.net core signalr 一.背景介绍 signalr的功能很强大,可以为我们实现websocket服务端节省不少的时间.但是可能由于不同的环境,我们在对 ...

  5. 在ASP.NET Core下使用SignalR技术

    一.前言 上次我们讲到过如何在ASP.NET Core中使用WebSocket,没有阅读过的朋友请参考 WebSocket in ASP.NET Core 文章 .这次的主角是SignalR它为我们提 ...

  6. 网络游戏开发-服务器(01)Asp.Net Core中的websocket,并封装一个简单的中间件

    先拉开MSDN的文档,大致读一遍 (https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets) WebSocket 是一 ...

  7. 快速搭建CentOS+ASP.NET Core环境支持WebSocket

    环境:CentOS 7.x,.net core 2 以下.net core 2安装操作为官方方法.如果你使用Docker,那么更简单了,只需要docker pull microsoft/dotnet就 ...

  8. Real-time chart using ASP.NET Core and WebSocket

    Solution in glance The following diagram illustrates our solution where IoT device reports readings ...

  9. ASP.NET Core Building chat room using WebSocket

    Creating “Login form” We use here simple form where user can insert his or her preferred nick name f ...

随机推荐

  1. poj 2947 Widget Factory (高斯消元解同余方程组+判断无解、多解)

    http://poj.org/problem?id=2947 血泪史: CE:poj的string类型要加string库,swap不能直接交换数组 WA: x[m-1]也有可能<3啊O(≧口≦) ...

  2. (一)Git时间--初识版本控制工具

    //配置一下你的身份 git config --global use.name "Douzi" git config --global use.email "jdouzi ...

  3. 各种奇妙的hack

    Android Selector Hacks WebKit .selector:not(*:root) {} Chrome * Safari * Opera ≥ 14 Android * # Java ...

  4. Implement Queue by Two Stacks & Implement Stack using Queues

    Implement Queue by Two Stacks Implement the following operations of a queue using stacks. push(x) -- ...

  5. Dhaka2011

    Dhaka2011 A - Binary Matrix 题目描述:有一个\(n \times m\)的\(01\)矩阵,这一矩阵第一行和最后一行是相邻的,第一列和最后一列是相邻的,现在每次可以交换相邻 ...

  6. React-Native 之 ListView使用

    前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...

  7. 关于sudo 权限被修改的解决方法

    在用sudo安装文件的时候,出现如下错误提示: sudo: /etc/sudoers is world writable sudo: no valid sudoers sources found, q ...

  8. Windwos8.1下配置PHP环境

    一.     下载安装包: Apache2.2:http://mirrors.cnnic.cn/apache//httpd/binaries/win32/httpd-2.2.25-win32-x86- ...

  9. vue项目里的日期格式化

    在项目中,我们经常需要把后台传回的日期进行格式化,可以在common里定义一个公共的js export function formatDate (date, fmt) { if (/(y+)/.tes ...

  10. 原生js实现ajax跨域(兼容IE8,IE9)

    html设置meta标签兼容360兼容模式和IE怪异模式 <meta http-equiv="X-UA-Compatible" content="IE=9;IE=8 ...