专业挖坑21年    


1.前 言

  网上找了很多资料,可能是自己找的路子不对吧,都找不到适合我这样萌新的文章,大多.net环境使用的websocket都是在说一个通信的案例,学起来的确很吃力,自己也挖坑很久才爬出来,所以本篇文章也只是对自己学习的做一个总结。

2.为什么需要WebSocket

  在已经存在http协议的情况下还使用其他协议?

  HTTP协议:通信只能是客户端发起,做不到服务器主动向客户端推送信息,以前使用轮询方式请求服务器(浪费资源、效率低)

  Websocket就是在这样的环境下发明的,在阮一峰老师文章中讲解很详细

  http://www.ruanyifeng.com/blog/2017/05/websocket.html

3.websocket怎样建立连接

  首先客户端需要和服务端达成握手的协议

  客户端

  向服务器发起连接

 webSocket = new WebSocket("ws://localhost/api/chat");

  服务端

  代码不完整只加入了接收的代码

        [Route]
[HttpGet]
public HttpResponseMessage Connect(string nickName)
{
//在服务端接受web socket请求,传入的函数作为web socket的处理函数,待web socket建立后该函数会被调用,
//在该函数中可以对web socket进行消息收发
HttpContext.Current.AcceptWebSocketRequest(ProcessRequest);//将websocket接受到AspNetWebSocketContext //构造同意切换至web socket的response
return Request.CreateResponse(HttpStatusCode.SwitchingProtocols);
} public async Task ProcessRequest(AspNetWebSocketContext context)
{
var socket = context.WebSocket;//传入的context中当前的web socket对象
     }

4.客户端的API

  Websocket给了几个回调函数,其他的API我就不一一列出了,阮老师的文章中写的很详细

//建立成功
webSocket.onopen = function () {
console.log("socket opened");
}
//异常
webSocket.onerror = function () {
console.log("An exception hai occurred");
}
//服务端返回消息回调
webSocket.onmessage = function (event) {
console.log(event.data);
}
//关闭连接回调
webSocket.onclose = function () {
console.log("socket closed");
} //向服务器发送数据
   webSocket.send("hellow word");
     //客户端主动断开连接
     webSocket.close();

5.关于服务端

  服务端建立连接之后作为一个初学者来说我想知道是怎样实现和客户端进行进行会话

  接收:

        //
// 摘要:
// 从 WebSocket 连接异步接受数据。
//
// 参数:
// buffer:
// 引用应用程序缓冲区,其为接收的数据的存储位置。
//
// cancellationToken:
// 传播有关应取消操作的通知。
//
// 返回结果:
// 返回 System.Threading.Tasks.Task`1。表示异步操作的任务对象。任务对象上的 System.Threading.Tasks.Task`1.Result
// 属性将返回包含已接收数据的 System.Byte 数组。
public abstract Task<WebSocketReceiveResult> ReceiveAsync(ArraySegment<byte> buffer, CancellationToken cancellationToken);

  发送: 

        //
// 摘要:
// 发送 WebSocket 上连接异步的数据。
//
// 参数:
// buffer:
// 要通过连接发送的缓冲区。
//
// messageType:
// 指示应用是否发送二进制或文本消息。
//
// endOfMessage:
// 指示在“缓冲区”的数据是否实消息的最后一部分。
//
// cancellationToken:
// 传播有关应取消操作的通知的标记。
//
// 返回结果:
// 返回 System.Threading.Tasks.Task。表示异步操作的任务对象。
public abstract Task SendAsync(ArraySegment<byte> buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken);

  其实整个过程就几句代码,但是一直找不到适合我自己的,走了很多弯路,最后把写的案例代码贴上来(虽然是看着别人的写的)

6.案例代码

  客户端

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div>
<input id="nickName" name="nickName" type="text" value="Jone" />
</div>
<div>
<input id="btnConnection" name="btnConnection" value="Connection" type="button" />
<input id="btnDisconnect" name="btnDisconnect" value="Disconnect" type="button" />
</div>
<div>
<input id="btnSend" name="btnSend" value="Send" type="button" />
</div>
<div id="message"> </div>
</body>
</html>
<script>
window.onload = function () {
document.getElementById("btnConnection").onclick = Connection;
document.getElementById("btnDisconnect").onclick = Disconnect;
document.getElementById("btnSend").onclick = Send;
//CreateWebSocket("ws://localhost/WebApiDemo/api/chat?nickName=b4s51x2");
} var webSocket; function Connection() {
webSocket = new WebSocket("ws://localhost/WebApiDemo/api/chat?nickName=b4s51x2");
InitEventHandles();
} function InitEventHandles() {
//建立成功
webSocket.onopen = function () {
console.log("socket opened");
}
//异常
webSocket.onerror = function () {
console.log("An exception hai occurred");
}
//服务端返回消息回调
webSocket.onmessage = function (event) {
console.log(event.data);
}
//关闭连接回调
webSocket.onclose = function () {
console.log("socket closed");
}
} function Send() {
//向服务器发送数据
webSocket.send(document.getElementById("nickName").value);
} function Disconnect() {
webSocket.close();
} </script>

  服务端

     
     private static List<WebSocket> _socket = new List<WebSocket>();      [Route]
[HttpGet]
public HttpResponseMessage Connect(string nickName)
{
//在服务端接受web socket请求,传入的函数作为web socket的处理函数,待web socket建立后该函数会被调用,
//在该函数中可以对web socket进行消息收发
HttpContext.Current.AcceptWebSocketRequest(ProcessRequest); //构造同意切换至web socket的response
return Request.CreateResponse(HttpStatusCode.SwitchingProtocols);
} public async Task ProcessRequest(AspNetWebSocketContext context)
{
var socket = context.WebSocket;//传入的context中当前的web socket对象
_socket.Add(socket);//此处将web socket对象加入一个静态列表中 //进入一个无限循环,当web socket close是循环结束
while (true)
{
var buffer = new ArraySegment<byte>(new byte[]);
var receviedResult = await socket.ReceiveAsync(buffer, CancellationToken.None);//对web socket进行异步接收数据
if (receviedResult.MessageType == WebSocketMessageType.Close)
{
await socket.CloseAsync(WebSocketCloseStatus.Empty, string.Empty, CancellationToken.None);//如果client发起close请求,对client进行ack
_socket.Remove(socket);
break;
} if (socket.State == WebSocketState.Open)
{
string recvMsg = Encoding.UTF8.GetString(buffer.Array, , receviedResult.Count);
var recvBytes = Encoding.UTF8.GetBytes(recvMsg);
var sendBuffer = new ArraySegment<byte>(recvBytes);
foreach (var innerSocket in _socket)//当接收到文本消息时,对当前服务器上所有web socket链接进行广播
{
if (innerSocket == socket)
{
await innerSocket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
}
} }

服务端原文章找不到了,最后感谢各位大佬提供的文章学习。

.net使用websocket的更多相关文章

  1. 漫扯:从polling到Websocket

    Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response.这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息... 轮询 老大发火了,小弟们自 ...

  2. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  3. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  4. WebSocket - ( 一.概述 )

    说到 WebSocket,不得不提 HTML5,作为近年来Web技术领域最大的改进与变化,包含CSS3.离线与存储.多媒体.连接性( Connectivity )等一系列领域,而即将介绍的 WebSo ...

  5. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  6. Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

  7. Cowboy 开源 WebSocket 网络库

    Cowboy.WebSockets 是一个托管在 GitHub 上的基于 .NET/C# 实现的开源 WebSocket 网络库,其完整的实现了 RFC 6455 (The WebSocket Pro ...

  8. 借助Nodejs探究WebSocket

    文章导读: 一.概述-what's WebSocket? 二.运行在浏览器中的WebSocket客户端+使用ws模块搭建的简单服务器 三.Node中的WebSocket 四.socket.io 五.扩 ...

  9. 细说websocket - php篇

    下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket ...

  10. webSocket and LKDBHelper的使用说明

    socketket与lkdbhelper来处理数据 客户需求: 当我们有需要从自己的后台推送消息给我们的用户时,用户需要实时的接收到来自我们的推送消息.前提是没有使用第三方的推送框架,那么这个使用we ...

随机推荐

  1. build.gradle

    1.将Eclipse项目导入到Android studio 中 很多点9图出现问题解决方法: 在build.gradle里添加以下两句: aaptOptions.cruncherEnabled = f ...

  2. 包建强的培训课程(15):Android App热修复技术

    @import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...

  3. 【CSS/JS】如何实现单行/多行文本溢出的省略(...)--老司机绕过坑道的正确姿势

    写前端UI的朋友们也许都遇到过这样的问题:我们需要实现这样一个需求,在一个父级元素中隐藏一个可能过长的文本:   这个文本可能是单行的:   也可能是多行的:   下面我就给大家展示如何简单或优雅地实 ...

  4. 53_并发编程-线程-GIL锁

    一.GIL - 全局解释器锁   有了GIL的存在,同一时刻同一进程中只有一个线程被执行:由于线程不能使用cpu多核,可以开多个进程实现线程的并发,因为每个进程都会含有一个线程,每个进程都有自己的GI ...

  5. Java核心技术卷一基础知识-第14章-多线程-读书笔记

    第 14 章 多线程 本章内容: * 什么是线程 * 中断线程 * 线程状态 * 线程属性 * 同步 * 阻塞队列 * 线程安全的集合 * Collable与Future * 执行器 * 同步器 * ...

  6. Nginx 在 Linux 上的安装和配置

    一.Nginx的安装 1.单台Nginx的安装 Nginx在Linux上的安装可以参考这篇博客:http://blog.csdn.net/molingduzun123/article/details/ ...

  7. java中最常见的几种运行时异常,你get了吗?

    NullPointerException (空指针异常) ClassCastException (类型强制转换异常) NumberFormatException (数字格式异常) NegativeAr ...

  8. Scala - 快速学习04 - 求值策略

    表达式求值策略(Evaluation Strategy) Scala中所有的运算都是基于表达式的. Call By Value - 对函数实参求值,且仅求值一次:函数调用之前对所有表达式进行求值 Ca ...

  9. 签名时出错: 未在路径 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin

    在运行winform程序时,由于清理解决方案等缘故,出现了下面的情况 解决办法:项目-属性-签名-取消勾选“为ClickOne清单签名” 问题完美解决

  10. MRO

    在Python3里面,有多继承的时候,往往会出现调用Super失败的情况.Python里存在一种多继承 Super的调用顺序(C3算法),保证每个类调用一次. 体现:类名.__mro__ 使用Supe ...