【转】WebSocket初探

定义:

遵循RFC6544协议的通信协议。Webcoket协议和http协议属于并行关系,但是websocket是以http协议为基础开发出来的(微软用IhttpHandler接口中同时处理这两种协议),同时他们都是以TCP协议为基础。可以进行双向通信、持久化通信。Http是单向通信协议、无状态通信。

websocket协议(握手部分):

GET /chat HTTP/1.1
Host: http://server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

比http握手多了几个部分:

Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

这几个部分告诉服务器,该请求是Webcoket,不是http了。

接收的数据

GET /chat HTTP/1.1
Host: http://example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

发送的数据

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

 

服务端:

  • 使用第三方的Fleck库,建议采用吧,比较方便。
  • 使用第三方的websocketsharp库,不方便服务端主动推送数据到客户端。
  • 自己按照RFC6544协议,打包协议头+socket API库,收发数据。
  • 使用IIS8.0以上可以处理websocket请求:
namespace SimpleWebSocketApplication 
{ public class WebSocketHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { //Checks if the query is WebSocket request.  if (context.IsWebSocketRequest) { //If yes, we attach the asynchronous handler. context.AcceptWebSocketRequest(WebSocketRequestHandler); } } public bool IsReusable { get { return false; } } //Asynchronous request handler. public async Task WebSocketRequestHandler(AspNetWebSocketContext webSocketContext) { //Gets the current WebSocket object. WebSocket webSocket = webSocketContext.WebSocket; /*We define a certain constant which will represent size of received data. It is established by us and  we can set any value. We know that in this case the size of the sent data is very small. */ const int maxMessageSize = 1024; //Buffer for received bits. var receivedDataBuffer = new ArraySegment<Byte>(new Byte[maxMessageSize]); var cancellationToken = new CancellationToken(); //Checks WebSocket state. while (webSocket.State == WebSocketState.Open) { //Reads data. WebSocketReceiveResult webSocketReceiveResult = await webSocket.ReceiveAsync(receivedDataBuffer, cancellationToken); //If input frame is cancelation frame, send close command. if (webSocketReceiveResult.MessageType == WebSocketMessageType.Close) { await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, String.Empty, cancellationToken); } else { byte[] payloadData = receivedDataBuffer.Array.Where(b => b != 0).ToArray(); //Because we know that is a string, we convert it. string receiveString = System.Text.Encoding.UTF8.GetString(payloadData, 0, payloadData.Length); //Converts string to byte array. var newString = String.Format("Hello, " + receiveString + " ! Time {0}", DateTime.Now.ToString()); Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(newString); //Sends data back. await webSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, cancellationToken); } } } } 
}
  • 使用TcpListener类库,不能使用httpListener类库,,创建监听,并将发送的数据按RFC6544协议打包。
(创建监听)
class Server {
public static void Main() {
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 80);

server.Start();
Console.WriteLine("Server has started on 127.0.0.1:80.{0}Waiting for a connection...", Environment.NewLine);

TcpClient client = server.AcceptTcpClient();

Console.WriteLine("A client connected.");
}
}
(接收数据)
TcpClient client = server.AcceptTcpClient();

Console.WriteLine("A client connected.");

NetworkStream stream = client.GetStream();

while(client.Available < 3)
{
// wait for enough bytes to be available
}
//enter to an infinite cycle to be able to handle every change in stream
while (true) {
while (!stream.DataAvailable);

Byte[] bytes = new Byte[client.Available];

stream.Read(bytes, 0, bytes.Length);
}
(打包发送的数据)
if (new System.Text.RegularExpressions.Regex("^GET").IsMatch(data))
{
const string eol = "\r\n"; // HTTP/1.1 defines the sequence CR LF as the end-of-line marker

Byte[] response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + eol
+ "Connection: Upgrade" + eol
+ "Upgrade: websocket" + eol
+ "Sec-WebSocket-Accept: " + Convert.ToBase64String(
System.Security.Cryptography.SHA1.Create().ComputeHash(
Encoding.UTF8.GetBytes(
new System.Text.RegularExpressions.Regex("Sec-WebSocket-Key: (.*)").Match(data).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
)
)
) + eol
+ eol);

stream.Write(response, 0, response.Length);
}

客户端:

  • html5的JS库
  • Fleck库
  • websocketsharp库
  • 微软自己的wensocketclient库
  • 自己按照RFC6544协议,打包协议头+socket API库,收发数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应用程序标准输入输出、Shell、程序界面的关系

发展史 计算机在发展初期&#xff0c;电脑上的软件是没有窗口的&#xff0c;只有一个命令行&#xff0c;这个软件叫Shell&#xff0c;中文的意思是外壳。Shell是一个统一的叫法&#xff0c;实际在不同的系统中&#xff0c;又有很多种Shell软件&#xff0c;如下表所示&#xff…

安卓简单天气预报app源码_七个个小众但实用的APP,效率翻倍~

推荐7个小众但实用的APP1、PDF处理助手下面就是软件的启动图&#xff0c;没有任何广告。并且直接标明了这个软件的三大特点&#xff1a;简单、免费、快捷下面就是软件的启动图&#xff0c;没有任何广告。而且免注册登录即可使用&#xff0c;简直是一款良心软件了。2、菜鸟教程菜…

【转】Jenkins详细教程

最近花了一段时间研究jenkins这个工具。所以写下这篇文章&#xff0c;算是当做记录吧&#xff01; 一、jenkins是什么&#xff1f; Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要…

【Github】怎么在README.md中添加图片?

原理是将图片作为文档上传&#xff0c;在README.md中引用即可。 参考博客&#xff1a;【GitHub】给GitHub上的ReadMe.md文件中添加图片怎么做 、 gitHub创建文件夹

拼接符 防注入正则校验_Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)

1、前言Apache Kylin是一个开源的、分布式的分析型数据仓库&#xff0c;提供Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据。近日&#xff0c;百度云安全团队监测到Apache官方发出了一个漏洞通告&#xff0c;披露了Apache kylin多版本存在命令注入漏…

【转】一个ASP.NET MVC中ajax调用WebApi返回500 Internal Server Error的调错方法。

ASP.NET MVC 引入的WebApi自然且较好地满足了ajax的交互需求&#xff0c;但使用jQuery ajax调用WebApi返回500 Internal Server Error时却不太好查找错误。在一个实际项目中&#xff0c;WebApi方法全部使用了try-catch捕获异常&#xff0c;并返回定制的错误消息&#xff0c;想当…

【Github】开源项目xterm.js

项目github地址&#xff1a; xterm.js on github 学习笔记 从项目介绍中进行知识拓展 名称资料npmnpm 是干什么的&#xff1f;&#xff08;非教程&#xff09;semversemver&#xff1a;语义化版本规范在 Node.js 中的实现Hyper软件官网 >Theia官网 >Electron官网 >…

can使能上拉 gpio_IMX6ULL 的 GPIO 操作方法

来源&#xff1a;百问网作者&#xff1a;韦东山本文字数&#xff1a;1652&#xff0c;阅读时长&#xff1a;4分钟CCM: Clock Controller Module (时钟控制模块) IOMUXC : IOMUX Controller&#xff0c;IO 复用控制器 GPIO: General-purpose input/output&#xff0c;通用的输入…

【转】.NET 的 WebSocket 开发包比较

转载于http://www.oschina.net/translate/websocket-libraries-comparison-2 编者按 本文出现在第三方产品评论部分中。在这一部分的文章只提供给会员&#xff0c;不允许工具供应商用来以任何方式和形式来促销或宣传产品。请会员报告任何垃圾信息或广告。 Web项目常常需要将数…

【编译原理】为什么编程语言中,标识符不能以数字开头?

标识符不能以数字为开头, 是为了简化词法解析器设计和实现&#xff0c;规避词法解析中以数字开头的变量与数字解析冲突的问题。 如果两种类型的词&#xff0c;如果起始符号不同&#xff0c;那么可以很容易把二者区分开&#xff1b;如果起始符号相同&#xff0c;那么以下符号&a…

vb checkbox选中和不选中_UE4 4.23 RetainerBox 选中框位置不正确

Bug表现在UE4 4.23版本&#xff0c;实现自定义控件时&#xff0c;继承了RetainerBox&#xff0c;发现当内部包裹子控件时&#xff0c;先编辑器面板选中子物体&#xff0c;发现选中位置有偏移。位置偏移当窗口缩放时&#xff0c;选中框位置发现当窗口最小化时&#xff0c;偏移位…

python编辑器spyder运行_使用spyder编译器单步调试python

1、将需要进行单步调试的函数在脚本中进行调用(十分重要的一步)。由于python是解释型语言&#xff0c;在进行单步调试的时候需要告诉系统你使用了这个函数&#xff0c;单步调试才会进入你所需要调式的函数。如下图所示&#xff0c;我们定义了createDataSet()函数&#xff0c;在…

去哪查阅ISO国际标准?

ISO官网 访问ISO官网&#xff0c;不需要翻墙&#xff0c;只要懂点英文就行。 ISO官网地址&#xff1a;https://www.iso.org/&#xff08;可进行全面了解、购买付费内容&#xff09; ISO部分公开标准下载地址&#xff1a;https://standards.iso.org/ittf/PubliclyAvailableSt…

【转】开源的C# websocket-sharp组件解析

下面我们介绍一款WebSocket组件websocket-sharp的相关内容。 一.websocket-sharp组件概述 websocket-sharp是一个C#实现websocket协议客户端和服务端&#xff0c;websocket-sharp支持RFC 6455&#xff1b;WebSocket客户端和服务器&#xff1b;消息压缩扩展&#xff1b;安全连接…

【编译原理】什么是上下文无关文法?

上下文无关是指&#xff0c;一句话的含义与其前后的内容没有或者几乎没有关系&#xff0c;只由自己决定&#xff0c;把它剪切到其他任何位置&#xff0c;也还是原有的意思。 例如&#xff1a; ... a 0; ...这是一个赋值语句&#xff0c;无论此语句的前后是什么代码&#xff…

python解析html的库_用python解析html

python中&#xff0c;有三个库可以解析html文本&#xff0c;HTMLParser,sgmllib,htmllib。他们的实现方法不通&#xff0c;但功能差不多。这三个库中 提供解析html的类都是基类&#xff0c;本身并不做具体的工作。他们在发现的元件后(如标签、注释、声名等)&#xff0c;会调用相…

【转】3.1(译)构建Async同步基元,Part 1 AsyncManualResetEvent

传送门&#xff1a;异步编程系列目录…… 最近在学习.NET4.5关于“并行任务”的使用。“并行任务”有自己的同步机制&#xff0c;没有显示给出类似如旧版本的&#xff1a;事件等待句柄、信号量、lock、ReaderWriterLock……等同步基元对象&#xff0c;但我们可以沿溪这一编程习…

java异或_JAVA面试必备之HashMap必会点

今天我们就面试会问到关于HashMap的问题进行一个汇总&#xff0c;以及对这些问题进行解答。1、HashMap的数据结构是什么&#xff1f;2、为啥是线程不安全的&#xff1f;3、Hash算法是怎样实现的&#xff1f;4、HashMap是如何处理Hash碰撞的&#xff1f;5、增加元素的方法是怎么…

【编译原理】什么是AST?

自己写的确实没有别人写的好&#xff0c;所以在此推荐以下内容供参考&#xff1a; 抽象语法树—百度百科 AST系列(一): 抽象语法树为什么抽象 编程语言的实现&#xff0c;从AST&#xff08;抽象语法树&#xff09;开始 知乎话题-抽象语法树

【转】3.2(译)构建Async同步基元,Part 2 AsyncAutoResetEvent

传送门&#xff1a;异步编程系列目录…… 最近在学习.NET4.5关于“并行任务”的使用。“并行任务”有自己的同步机制&#xff0c;没有显示给出类似如旧版本的&#xff1a;事件等待句柄、信号量、lock、ReaderWriterLock……等同步基元对象&#xff0c;但我们可以沿溪这一编程习…