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

四川省城乡和建设厅网站wordpress下载慢

四川省城乡和建设厅网站,wordpress下载慢,哈尔滨建设工程有限公司,给网站做导流WebSocket协议是基于TCP的一种新的协议。WebSocket最初在HTML5规范中被引用为TCP连接#xff0c;作为基于TCP的套接字API的占位符。它实现了浏览器与服务器全双工(full-duplex)通信。其本质是保持TCP连接#xff0c;在浏览器和服务端通过Socket进行通信。 本文将使用Python编…WebSocket协议是基于TCP的一种新的协议。WebSocket最初在HTML5规范中被引用为TCP连接作为基于TCP的套接字API的占位符。它实现了浏览器与服务器全双工(full-duplex)通信。其本质是保持TCP连接在浏览器和服务端通过Socket进行通信。  本文将使用Python编写Socket服务端一步一步分析请求过程 1. 启动服务端 import socket sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((127.0.0.1, 8002)) sock.listen(5) # 等待用户连接 conn, address sock.accept() ... ... ...启动Socket服务器后等待用户【连接】然后进行收发数据。 2. 客户端连接 script typetext/javascriptvar socket new WebSocket(ws://127.0.0.1:8002/xxoo);... /script 当客户端向服务端发送连接请求时不仅连接还会发送【握手】信息并等待服务端响应至此连接才创建成功 3. 建立连接【握手】 import socketsock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((127.0.0.1, 8002)) sock.listen(5) # 获取客户端socket对象 conn, address sock.accept() # 获取客户端的【握手】信息 data conn.recv(1024) ... ... ... conn.send(响应【握手】信息)请求和响应的【握手】信息需要遵循规则 从请求【握手】信息中提取 Sec-WebSocket-Key利用magic_string 和 Sec-WebSocket-Key 进行hmac1加密再进行base64加密将加密结果响应给客户端注magic string为258EAFA5-E914-47DA-95CA-C5AB0DC85B11 请求【握手】信息为 GET /chatsocket HTTP/1.1 Host: 127.0.0.1:8002 Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Origin: http://localhost:63342 Sec-WebSocket-Version: 13 Sec-WebSocket-Key: mnwFxiOlctXFN/DeMt1Amg Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits ... ...提取Sec-WebSocket-Key值并加密 import socket import base64 import hashlibdef get_headers(data):将请求头格式化成字典:param data::return:header_dict {}data str(data, encodingutf-8)for i in data.split(\r\n):print(i)header, body data.split(\r\n\r\n, 1)header_list header.split(\r\n)for i in range(0, len(header_list)):if i 0:if len(header_list[i].split( )) 3:header_dict[method], header_dict[url], header_dict[protocol] header_list[i].split( )else:k, v header_list[i].split(:, 1)header_dict[k] v.strip()return header_dictsock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((127.0.0.1, 8002)) sock.listen(5)conn, address sock.accept() data conn.recv(1024) headers get_headers(data) # 提取请求头信息 # 对请求头中的sec-websocket-key进行加密 response_tpl HTTP/1.1 101 Switching Protocols\r\n \Upgrade:websocket\r\n \Connection: Upgrade\r\n \Sec-WebSocket-Accept: %s\r\n \WebSocket-Location: ws://%s%s\r\n\r\n magic_string 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 value headers[Sec-WebSocket-Key] magic_string ac base64.b64encode(hashlib.sha1(value.encode(utf-8)).digest()) response_str response_tpl % (ac.decode(utf-8), headers[Host], headers[url]) # 响应【握手】信息 conn.send(bytes(response_str, encodingutf-8)) ... ... ...4.客户端和服务端收发数据 客户端和服务端传输数据时需要对数据进行【封包】和【解包】。客户端的JavaScript类库已经封装【封包】和【解包】过程但Socket服务端需要手动实现。 第一步获取客户端发送的数据【解包】 info conn.recv(8096)payload_len info[1] 127if payload_len 126:extend_payload_len info[2:4]mask info[4:8]decoded info[8:]elif payload_len 127:extend_payload_len info[2:10]mask info[10:14]decoded info[14:]else:extend_payload_len Nonemask info[2:6]decoded info[6:]bytes_list bytearray()for i in range(len(decoded)):chunk decoded[i] ^ mask[i % 4]bytes_list.append(chunk)body str(bytes_list, encodingutf-8)print(body) 基于Python实现解包过程未实现长内容 解包详细过程  0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1--------------------------------------------------------|F|R|R|R| opcode|M| Payload len | Extended payload length ||I|S|S|S| (4) |A| (7) | (16/64) ||N|V|V|V| |S| | (if payload len126/127) || |1|2|3| |K| | |------------------------- - - - - - - - - - - - - - - - | Extended payload length continued, if payload len 127 | - - - - - - - - - - - - - - - -------------------------------| |Masking-key, if MASK set to 1 |--------------------------------------------------------------| Masking-key (continued) | Payload Data |-------------------------------- - - - - - - - - - - - - - - - : Payload Data continued ... : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | Payload Data continued ... |--------------------------------------------------------------- The MASK bit simply tells whether the message is encoded. Messages from the client must be masked, so your server should expect this to be 1. (In fact, section 5.1 of the spec says that your server must disconnect from a client if that client sends an unmasked message.) When sending a frame back to the client, do not mask it and do not set the mask bit. Well explain masking later. Note: You have to mask messages even when using a secure socket.RSV1-3 can be ignored, they are for extensions. The opcode field defines how to interpret the payload data: 0x0 for continuation, 0x1 for text (which is always encoded in UTF-8), 0x2 for binary, and other so-called control codes that will be discussed later. In this version of WebSockets, 0x3 to 0x7 and 0xB to 0xF have no meaning. The FIN bit tells whether this is the last message in a series. If its 0, then the server will keep listening for more parts of the message; otherwise, the server should consider the message delivered. More on this later. Decoding Payload Length To read the payload data, you must know when to stop reading. Thats why the payload length is important to know. Unfortunately, this is somewhat complicated. To read it, follow these steps: Read bits 9-15 (inclusive) and interpret that as an unsigned integer. If its 125 or less, then thats the length; youre done. If its 126, go to step 2. If its 127, go to step 3.Read the next 16 bits and interpret those as an unsigned integer. Youre done.Read the next 64 bits and interpret those as an unsigned integer (The most significant bit MUST be 0). Youre done.Reading and Unmasking the Data If the MASK bit was set (and it should be, for client-to-server messages), read the next 4 octets (32 bits); this is the masking key. Once the payload length and masking key is decoded, you can go ahead and read that number of bytes from the socket. Lets call the data ENCODED, and the key MASK. To get DECODED, loop through the octets (bytes a.k.a. characters for text data) of ENCODED and XOR the octet with the (i modulo 4)th octet of MASK. In pseudo-code (that happens to be valid JavaScript):   var DECODED ;for (var i 0; i ENCODED.length; i) {    DECODED[i] ENCODED[i] ^ MASK[i % 4];}   Now you can figure out what DECODED means depending on your application.  第二步向客户端发送数据【封包】 def send_msg(conn, msg_bytes):WebSocket服务端向客户端发送消息:param conn: 客户端连接到服务器端的socket对象,即 conn,address socket.accept():param msg_bytes: 向客户端发送的字节:return: import structtoken b\x81length len(msg_bytes)if length 126:token struct.pack(B, length)elif length 0xFFFF:token struct.pack(!BH, 126, length)else:token struct.pack(!BQ, 127, length)msg token msg_bytesconn.send(msg)return True View Code 5. 基于Python实现简单示例 a. 基于Python socket实现的WebSocket服务端 #!/usr/bin/env python # -*- coding:utf-8 -*- import socket import base64 import hashlibdef get_headers(data):将请求头格式化成字典:param data::return:header_dict {}data str(data, encodingutf-8)header, body data.split(\r\n\r\n, 1)header_list header.split(\r\n)for i in range(0, len(header_list)):if i 0:if len(header_list[i].split( )) 3:header_dict[method], header_dict[url], header_dict[protocol] header_list[i].split( )else:k, v header_list[i].split(:, 1)header_dict[k] v.strip()return header_dictdef send_msg(conn, msg_bytes):WebSocket服务端向客户端发送消息:param conn: 客户端连接到服务器端的socket对象,即 conn,address socket.accept():param msg_bytes: 向客户端发送的字节:return: import structtoken b\x81length len(msg_bytes)if length 126:token struct.pack(B, length)elif length 0xFFFF:token struct.pack(!BH, 126, length)else:token struct.pack(!BQ, 127, length)msg token msg_bytesconn.send(msg)return Truedef run():sock socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)sock.bind((127.0.0.1, 8003))sock.listen(5)conn, address sock.accept()data conn.recv(1024)headers get_headers(data)response_tpl HTTP/1.1 101 Switching Protocols\r\n \Upgrade:websocket\r\n \Connection:Upgrade\r\n \Sec-WebSocket-Accept:%s\r\n \WebSocket-Location:ws://%s%s\r\n\r\nvalue headers[Sec-WebSocket-Key] 258EAFA5-E914-47DA-95CA-C5AB0DC85B11ac base64.b64encode(hashlib.sha1(value.encode(utf-8)).digest())response_str response_tpl % (ac.decode(utf-8), headers[Host], headers[url])conn.send(bytes(response_str, encodingutf-8))while True:try:info conn.recv(8096)except Exception as e:info Noneif not info:breakpayload_len info[1] 127if payload_len 126:extend_payload_len info[2:4]mask info[4:8]decoded info[8:]elif payload_len 127:extend_payload_len info[2:10]mask info[10:14]decoded info[14:]else:extend_payload_len Nonemask info[2:6]decoded info[6:]bytes_list bytearray()for i in range(len(decoded)):chunk decoded[i] ^ mask[i % 4]bytes_list.append(chunk)body str(bytes_list, encodingutf-8)send_msg(conn,body.encode(utf-8))sock.close()if __name__ __main__:run()b. 利用JavaScript类库实现客户端 !DOCTYPE html html head langenmeta charsetUTF-8title/title /head bodydivinput typetext idtxt/input typebutton idbtn value提交 οnclicksendMsg();/input typebutton idclose value关闭连接 οnclickcloseConn();//divdiv idcontent/divscript typetext/javascriptvar socket new WebSocket(ws://127.0.0.1:8003/chatsocket);socket.onopen function () {/* 与服务器端连接成功后自动执行 */var newTag document.createElement(div);newTag.innerHTML 【连接成功】;document.getElementById(content).appendChild(newTag);};socket.onmessage function (event) {/* 服务器端向客户端发送数据时自动执行 */var response event.data;var newTag document.createElement(div);newTag.innerHTML response;document.getElementById(content).appendChild(newTag);};socket.onclose function (event) {/* 服务器端主动断开连接时自动执行 */var newTag document.createElement(div);newTag.innerHTML 【关闭连接】;document.getElementById(content).appendChild(newTag);};function sendMsg() {var txt document.getElementById(txt);socket.send(txt.value);txt.value ;}function closeConn() {socket.close();var newTag document.createElement(div);newTag.innerHTML 【关闭连接】;document.getElementById(content).appendChild(newTag);}/script /body /html6. 基于Tornado框架实现Web聊天室 Tornado是一个支持WebSocket的优秀框架其内部原理正如1~5步骤描述当然Tornado内部封装功能更加完整。 以下是基于Tornado实现的聊天室示例 #!/usr/bin/env python # -*- coding:utf-8 -*- import uuid import json import tornado.ioloop import tornado.web import tornado.websocketclass IndexHandler(tornado.web.RequestHandler):def get(self):self.render(index.html)class ChatHandler(tornado.websocket.WebSocketHandler):# 用户存储当前聊天室用户waiters set()# 用于存储历时消息messages []def open(self):客户端连接成功时自动执行:return: ChatHandler.waiters.add(self)uid str(uuid.uuid4())self.write_message(uid)for msg in ChatHandler.messages:content self.render_string(message.html, **msg)self.write_message(content)def on_message(self, message):客户端连发送消息时自动执行:param message: :return: msg json.loads(message)ChatHandler.messages.append(message)for client in ChatHandler.waiters:content client.render_string(message.html, **msg)client.write_message(content)def on_close(self):客户端关闭连接时自动执行:return: ChatHandler.waiters.remove(self)def run():settings {template_path: templates,static_path: static,}application tornado.web.Application([(r/, IndexHandler),(r/chat, ChatHandler),], **settings)application.listen(8888)tornado.ioloop.IOLoop.instance().start()if __name__ __main__:run() app.py !DOCTYPE html html langen headmeta charsetUTF-8titlePython聊天室/title /head bodylt;divinput typetext idtxt/input typebutton idbtn value提交 onclicksendMsg();/input typebutton idclose value关闭连接 onclickcloseConn();//divdiv idcontainer styleborder: 1px solid #dddddd;margin: 20px;min-height: 500px;/divscript src/static/jquery-2.1.4.min.js/scriptscript typetext/javascript$(function () {wsUpdater.start();});var wsUpdater {socket: null,uid: null,start: function() {var url ws://127.0.0.1:8888/chat;wsUpdater.socket new WebSocket(url);wsUpdater.socket.onmessage function(event) {console.log(event);if(wsUpdater.uid){wsUpdater.showMessage(event.data);}else{wsUpdater.uid event.data;}}},showMessage: function(content) {$(#container).append(content);}};function sendMsg() {var msg {uid: wsUpdater.uid,message: $(#txt).val()};wsUpdater.socket.send(JSON.stringify(msg));}/script/body /html index.html     转载于:https://www.cnblogs.com/hedeyong/p/8128129.html
http://www.huolong8.cn/news/40989/

相关文章:

  • 濮阳房产网站建设店铺推广软件
  • 有一个专门做lol同人的网站建筑专业律师事务所
  • 价值30万的网站建设什么网站系统做的最好的
  • 企业网站免费制作佛山房地产新闻
  • 卖东西的网站怎么建设网页图片怎么打印出来
  • 网页制作与网站建设技术详解自己做的网站403
  • 哪个网站能免费下载如何给自己网站做网站优化
  • 公司网站案例展示wordpress首页文章设置
  • 做信息类网站有哪些电子商务教材电子版
  • 北京seo顾问服务公司网站seo工作内容
  • 备案的域名做电影网站海口网站运营托管咨询
  • 大连企业网站制作行业关键词一览表
  • 免费设计装修网站汕头网站建设科技有限公司
  • 网站推广的搜索引擎推广市场策划是做什么的
  • 网站推广营销收费关键对话
  • 国家企业信息系统公示查询上海关键词优化推荐
  • 网站运行环境配置wordpress xydown
  • 免费设计海报网站赣州推广团队
  • 百度域名查询官网seo常用的优化工具
  • 网站建设预付费入什么科目浅谈学校网站建设
  • 有哪些可以做头像的网站网站开发的技术
  • 南平住房和城乡建设部网站wordpress如何发表新文章
  • 哪个网站可以做puzzlewordpress修改成中文字体
  • 长沙企业建站程序建设项目技术服务网站
  • 百度网站收录入口杭州网页设计公司
  • pa66用途障车做网站信息科技公司网站怎么做
  • 做校园文化的网站建站wordpress 基础
  • 网站后台管理员怎么做公司备案网站负责人是谁
  • 看那种片哪个网站好用泉州哪个公司网站做的好
  • 公司网站维护费怎么做分录如何在手机上编程游戏