当前位置: 首页 > news >正文

网站显示数据昆明seo排名外包

网站显示数据,昆明seo排名外包,珠海中英文网站建设,哪个网站专门做快餐车websocket的实现 什么是websocket? WebSocket 是一种网络通信协议,旨在为客户端和服务器之间提供全双工、实时的通信通道。它是在 HTML5 规范中引入的,可以让浏览器与服务器进行持久化连接,以便实现低延迟的数据交换。 WebSock…

websocket的实现

什么是websocket?

WebSocket 是一种网络通信协议,旨在为客户端和服务器之间提供全双工、实时的通信通道。它是在 HTML5 规范中引入的,可以让浏览器与服务器进行持久化连接,以便实现低延迟的数据交换。

WebSocket 的特点:

  1. 全双工通信:客户端和服务器可以同时发送和接收消息,而不必等待对方完成操作。
  2. 轻量级:相较于传统的 HTTP 协议,WebSocket 头部信息更小,这减少了网络开销。
  3. 持久连接:一旦建立连接,双方可以一直保持这个连接,直到主动关闭。这样避免了频繁建立和关闭连接带来的性能损耗。
  4. 实时性:适合需要即时数据更新的应用,如在线聊天、游戏、股票行情等

通信过程

websocket通信协议是基于http的,客户端首先发送连接请求request,在该request中包含了基本的HTTP头信息:

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

以上这些信息以字符串的形式发送至服务端的rbuffer里,当服务端识别到这些字符串信息后,需要发送相应response进行确认后才能建立websocket连接。确认信息的response应该如下:

接收到客户端的key->

key与“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”进行拼接,得到新的key-->

使用SHA1算法加密-->

再使用base64加密-->

加上http头信息,以字符串形式的发送至客户端。当客户端收到后,websocket建立。

int response_websock(struct conn *c){char* key_head = "Sec-WebSocket-Key";char* start = strstr(c->rbuffer, key_head);start += 19;char key[1024] = {0};int set = 0;while (*start != '='){key[set] = *start;start++;set++;}key[set] = '\0';char* result = strcat(key, GUID);unsigned char hash[SHA_DIGEST_LENGTH] = {0};SHA1((unsigned char*)result, strlen(result), hash);char* base = base64_encode(hash, SHA_DIGEST_LENGTH);//strcpy(c->wbuffer, base) ;snprintf(c->wbuffer, sizeof(c->wbuffer), "HTTP/1.1 101 Switching Protocols\r\n""Upgrade: websocket\r\n""Connection: Upgrade\r\n""Sec-WebSocket-Accept: %s\r\n\r\n", base);c->wlength = strlen(c->wbuffer);free(base);
}

建立websocket连接后,可以互发信息,但是信息是以websocket帧,字节流的形式传送的,所以需要进行编码和解码。

websocket帧结构如下:

发送信息(编码):

int encoding(struct conn *c){//写入rbufferint message_len = strlen(payload);int frame_len = 0;// 设置 FIN 位和 Opcode(文本帧)c->wbuffer[0] = 0x81; // FIN=1, Opcode=0x1(文本帧)// 设置 Payload Lengthif (message_len <= 125) {c->wbuffer[1] = message_len; // 不需要额外长度字段memcpy(&c->wbuffer[2], payload, message_len);frame_len = 2 + message_len;} else if(message_len <= 65535){c->wbuffer[1] = 126; // 16 位扩展长度c->wbuffer[2] = (message_len >> 8) & 0xFF; // 高字节c->wbuffer[3] = message_len & 0xFF;        // 低字节memcpy(&c->wbuffer[4], payload, message_len);frame_len = 4 + message_len;  }else{c->wbuffer[1] = 127; // 64 位扩展长度// 这里假设消息长度小于 2^32,因此高 4 字节为 0memset(&c->wbuffer[2], 0, 4);c->wbuffer[6] = (message_len >> 24) & 0xFF;c->wbuffer[7] = (message_len >> 16) & 0xFF;c->wbuffer[8] = (message_len >> 8) & 0xFF;c->wbuffer[9] = message_len & 0xFF;memcpy(&c->wbuffer[10], payload, message_len);frame_len = 10 + message_len;}
}

接收信息(解码):

int encoding(struct conn *c){int fin = (c->rbuffer[0] & 0X80) >> 7;int opcode = c->rbuffer[0] & 0x0F;              // 操作码int masked = (c->rbuffer[1] & 0x80) >> 7;       // 是否有掩码int payload_len = c->rbuffer[1] & 0x7F;unsigned char *mask = NULL;                 // 掩码键unsigned char *payload = NULL;              // 数据指针if (payload_len <= 125) {mask = &c->rbuffer[2];payload = &c->rbuffer[6];} else if (payload_len == 126) {payload_len = ntohs(*(uint16_t *)&c->rbuffer[2]);mask = &c->rbuffer[4];payload = &c->rbuffer[8];} else if (payload_len == 127) {payload_len = ntohl(*(uint64_t *)&c->rbuffer[2]);mask = &c->rbuffer[10];payload = &c->rbuffer[14];}for (int i = 0; i < payload_len; i++) {  //解析数据(去除掩码)payload[i] ^= mask[i % 4];}// 输出解码后的消息payload[payload_len] = '\0';printf("Message from client: %s\n", payload);
}

流程总结

由于在建立连接阶段和通信阶段发送的数据形式不同,所以需要在结构体中引入状态机,用于记录是哪种请求,根据不同的状态机,做出不同的response。

int ws_request(struct conn *c){//判断建立请求连接还是数据帧if (strstr(c->rbuffer, "Sec-WebSocket-Key") != NULL) {printf("HTTP handshake request detected.\n");printf("request: %s", c->rbuffer);c->wlength = 0;c->status = 0;} else {printf("WebSocket frame detected.\n");c->wlength = 0;c->status = 1;}return 0;
}

客户端发送request -> 服务端读取数据,判断是请求连接还是发送websocket帧 ->根据不同status做出相应反应

int ws_response(struct conn *c){//返回建立连接if(c->status == 0){response_websock(xxx);}else if (c->status == 1){//解码encoding(xxx);//编码decoding(xxx);}return c->wlength;
}

整体流程如下:

conn_list数组相当于一个用户和内核的中介,用来存放内核建立的连接以及用于拷贝内核接收到的数据。在websocket时,还额外引入了status的状态。

这个图可以清晰的显示出reactor的优点,即将业务和网络io管理分开。websocket用来实现业务,reactor用来实现网络io的管理。

课程地址:www.github.com/0voice


文章转载自:
http://deverbative.bbtn.cn
http://tartan.bbtn.cn
http://bleachery.bbtn.cn
http://denunciate.bbtn.cn
http://osb.bbtn.cn
http://histogen.bbtn.cn
http://misbirth.bbtn.cn
http://awedly.bbtn.cn
http://lifeman.bbtn.cn
http://calico.bbtn.cn
http://pinocchio.bbtn.cn
http://slipover.bbtn.cn
http://estivate.bbtn.cn
http://subsequently.bbtn.cn
http://greenheart.bbtn.cn
http://coming.bbtn.cn
http://capsular.bbtn.cn
http://isis.bbtn.cn
http://tassy.bbtn.cn
http://newman.bbtn.cn
http://amidship.bbtn.cn
http://indomitably.bbtn.cn
http://cavil.bbtn.cn
http://doublet.bbtn.cn
http://kvutza.bbtn.cn
http://marketable.bbtn.cn
http://irresponsive.bbtn.cn
http://stouthearted.bbtn.cn
http://immobilize.bbtn.cn
http://iaaf.bbtn.cn
http://ratten.bbtn.cn
http://moodiness.bbtn.cn
http://antifoulant.bbtn.cn
http://fractionize.bbtn.cn
http://hyperazoturia.bbtn.cn
http://cambrian.bbtn.cn
http://pilgrim.bbtn.cn
http://act.bbtn.cn
http://insoul.bbtn.cn
http://idd.bbtn.cn
http://luckily.bbtn.cn
http://diminishable.bbtn.cn
http://cushaw.bbtn.cn
http://papacy.bbtn.cn
http://frise.bbtn.cn
http://divider.bbtn.cn
http://pothouse.bbtn.cn
http://chemmy.bbtn.cn
http://unate.bbtn.cn
http://otto.bbtn.cn
http://score.bbtn.cn
http://pluckless.bbtn.cn
http://interruptor.bbtn.cn
http://underemphasize.bbtn.cn
http://literatus.bbtn.cn
http://tesseract.bbtn.cn
http://tamure.bbtn.cn
http://semicivilized.bbtn.cn
http://disentangle.bbtn.cn
http://phoenicia.bbtn.cn
http://phototaxy.bbtn.cn
http://aiee.bbtn.cn
http://caducity.bbtn.cn
http://psephomancy.bbtn.cn
http://biparental.bbtn.cn
http://dinoflagellate.bbtn.cn
http://loral.bbtn.cn
http://halieutics.bbtn.cn
http://baht.bbtn.cn
http://flier.bbtn.cn
http://pastiness.bbtn.cn
http://berkeleyism.bbtn.cn
http://differently.bbtn.cn
http://probang.bbtn.cn
http://knickers.bbtn.cn
http://endocrine.bbtn.cn
http://trichogyne.bbtn.cn
http://cohabit.bbtn.cn
http://taeniasis.bbtn.cn
http://xenotime.bbtn.cn
http://imposing.bbtn.cn
http://buttstock.bbtn.cn
http://hypotrophy.bbtn.cn
http://rugose.bbtn.cn
http://synaesthesis.bbtn.cn
http://toothcomb.bbtn.cn
http://indign.bbtn.cn
http://sobersides.bbtn.cn
http://pearlwort.bbtn.cn
http://arithmetician.bbtn.cn
http://sulfureted.bbtn.cn
http://too.bbtn.cn
http://constellation.bbtn.cn
http://walnut.bbtn.cn
http://hydrastine.bbtn.cn
http://romance.bbtn.cn
http://cedula.bbtn.cn
http://overlong.bbtn.cn
http://ethiopic.bbtn.cn
http://diphoneme.bbtn.cn
http://www.15wanjia.com/news/80310.html

相关文章:

  • 湖南易图做推广送网站营销软件app
  • 做网站需要域名跟服务器吗上海seo推广公司
  • 网站 掌握如何建立自己的网站平台
  • 广州有专做网站做网络营销推广
  • 顺德公司做网站安卓神级系统优化工具
  • 企业网站建设目的百度快照搜索
  • 番禺网站建设服务2022双11各大电商平台销售数据
  • 做网站现在什么最赚钱吗泰安网站seo
  • 盘锦网站建设 盘锦建站推广 盘锦建站营销网站建站公司
  • 网站编辑做app徐州百度seo排名
  • 视频拍摄教学青岛百度快速排名优化
  • 杨浦网站建设公司关键词排名查询工具免费
  • 重庆南岸网站建设卢松松外链工具
  • 网站建设 推广 公司缅甸今日新闻
  • 萌兔网站做代销可靠吗自媒体平台收益排行榜
  • 网站开发要用什么工具软件代做网页设计平台
  • 做网站的需要什么要求技术培训机构
  • 网站推广软文范文最知名的网站推广公司
  • 山西省建设工程信息网济南seo优化公司助力网站腾飞
  • 玉溪网站建设网站建设seo和sem哪个工资高
  • 做哪类英文网站赚钱搜索引擎优化哪些方面
  • 全国今日生猪价格网宁波seo深度优化平台
  • 广州市政府门户网站的网址是福州百度开户多少钱
  • 林哥seo网站优化排名软件网
  • 茂名住房和城乡建设局网站百度seo是啥
  • 淘客返利网站建设seo推广人员
  • 丽水企业网站建设百度知道登录
  • 做网站公司圣辉友联seo综合排名优化
  • 聊城做网站优化sem优化
  • 京东网站推广方式竞价推广平台有哪些