Flask--WebSocket

flask? ?websocket

?

websocket原理

Socket:
FTP - 文件服務
Django
Flask

Http - TCP:
1.一次請求 一次響應 斷開
2.客戶端永遠處于主動狀態
3.服務器永遠處于被動狀態
4.Http無狀態 - 在服務器不保存客戶端的信息
5.服務器無法主動找到客戶端

1.輪詢
客戶端向服務器不斷發起類似Http請求
服務器不斷的響應客戶端

帶上你的身份牌 - 服務器校驗身份
大爺去找你的消息 - 服務器獲取你應該拿到數據
if:拿到數據
else:拿不到數據 - 再次發起請求詢問服務器消息

劣勢:
1.雙端資源浪費
2.帶寬資源占用
3.不能保證數據實時性

上個世紀90年代 - 本世紀初:
24bps == 4-6KB
CPU == 800MHZ
內存 == 256MB
QQ -- ICQ

2.長輪詢
1.客戶端向服務器發起一個請求
2.服務器保持這個請求 不返回不響應
3.一定時間之后,服務器拋棄 or 返回
4.客戶端收到請求 立即再次發起保持

你去傳達室,大爺款待你喝茶,
喝茶等消息(保持)
上廁所(斷開)
再次回去喝茶等消息(保持)

劣勢:
1.服務器資源浪費
2.不能保證數據實時性
優勢:
1.節省客戶端資源
2.保證數據有效

當時的環境:本世紀初 - 目前
128bps == 20-30KB
Cpu == 1.4GHZ 奔騰4
內存 == 512MB


3.長連接
永久保持連接

1.你和大爺之間裝了一臺電話分機
2.你派人告訴大爺你的分機號碼
3.大爺撥通分機
4.你告訴大爺,有消息說句話,我派人去拿
5.你和大爺同時開啟了閉音

劣勢:
1.服務器CPU要求較高

優勢:
1.節省大量資源
2.數據實時有效性
3.帶寬幾乎不占用

現在的環境:
100mps == 百兆光纖 == 5MB/s || 2KB
CPU == 16核32線程 i9 3.2GHZ
內存 == 16GB

WebSocket協議:ws協議 ws://127.0.0.1 javascript封裝客戶端 http協議 http://127.0.0.1
三方:geventWebsocket Flask
Web框架 :用來進行Http請求的處理 (握手)


單聊:
收發快遞模型:
寄件人:user1 from_user
收件人:user2 to_user
包裹

user2:
寄件人是user1 打開包裹 - 被罵了
罵回去:
寄件人:user2
收件人:user1
包裹

user1:
寄件人是user2 打開包裹 - 罵回來了
對罵吧:
寄件人:user1
收件人:user2
包裹

?

websocket實現的群聊功能

from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket
from geventwebsocket.exceptions import WebSocketErrorfrom flask import Flask,render_template,requestapp = Flask(__name__)user_socket_list = []@app.route("/my_chat")
def my_chat():return render_template("M_chat.html")@app.route("/my_ws")
def my_ws():user_socket = request.environ.get("wsgi.websocket")user_socket_list.append(user_socket)print(len(user_socket_list),user_socket_list)while 1:try:msg = user_socket.receive()except WebSocketError:user_socket_list.remove(user_socket)return "goodbye"for u in user_socket_list:if u == user_socket:continuetry:u.send(msg)except :continueif __name__ == '__main__':http_server = WSGIServer(("0.0.0.0",9527),app,handler_class=WebSocketHandler)http_server.serve_forever()

?

html部分

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="../../static/bootstrap/css/bootstrap.min.css"><title>Title</title>
</head>
<body>
<div class="container"><div class="row"><div class="col-md-4"><div class="form-group"><label for="message">消息為:</label><input type="text" id="message" class="form-control"></div><button onclick="send_message()" class="btn btn-danger">發送</button></div><div id="chat_list" class="col-md-8"></div></div>
</div><script type="application/javascript">var ws = new WebSocket("ws://127.0.0.1:9527/my_ws");ws.onmessage = function (evenMessage) {var p = document.createElement("p");p.innerText = evenMessage.data;document.getElementById("chat_list").appendChild(p)};function send_message() {var message = document.getElementById("message").value;ws.send(message);}</script>
</body>
</html>

?

?

websocket實現的單聊功能

import jsonfrom geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket.websocket import WebSocket
from geventwebsocket.exceptions import WebSocketErrorfrom flask import Flask, request, render_templateapp = Flask(__name__)user_socket_dict = {}
@app.route("/my_chat")
def my_app():return render_template("my_chat.html")@app.route("/my_ws/<username>")
def my_ws(username):user_socket = request.environ.get("wsgi.websocket")user_socket_dict[username] = user_socket# print(len(user_socket_dict),user_socket_dict)while 1 :try:msg = user_socket.receive()# print(msg)msg_dict = json.loads(msg)to_user = msg_dict.get("to_user")to_user_socket = user_socket_dict.get(to_user)to_user_socket.send(msg)except WebSocketError:user_socket_dict.pop(username)return "goodbye"if __name__ == '__main__':http_server = WSGIServer(("0.0.0.0", 5000), app, handler_class=WebSocketHandler)http_server.serve_forever()

html部分

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="../../static/bootstrap/css/bootstrap.min.css"><title>Title</title>
</head>
<body>
<div class="container"><div class="row"><div class="col-md-4"><div class="form-group"><label for="mynickname">用戶名:</label><input type="text" id="mynickname" class="form-control"></div><button onclick="open_chat()" class="btn btn-danger">登錄聊天室</button><div class="form-group"><label for="to_user">發送給:</label><input type="text" id="to_user" class="form-control"></div><div class="form-group"><label for="message">消息為:</label><input type="text" id="message" class="form-control"></div><button onclick="send_message()" class="btn btn-danger">發送</button></div><div id="chat_list" class="col-md-8"></div></div>
</div><script type="application/javascript">var ws = null;function open_chat() {var mynickname = document.getElementById("mynickname").value;ws = new WebSocket("ws://127.0.0.1:5000/my_ws/" + mynickname);ws.onopen = function () {alert(mynickname + "歡迎來到對話平臺");};ws.onmessage = function (evenMessage) {console.log(evenMessage.data);var chat = JSON.parse(evenMessage.data);var p = document.createElement("p");p.style.cssText = "width: 400px ;text-align: left";p.innerText = chat.from_user + "->" + chat.message;document.getElementById("chat_list").appendChild(p);};ws.onclose = function () {//斷開機制
            console.log("連接已斷開,你已經斷啦")};}function send_message() {var message = document.getElementById("message").value;var from_user = document.getElementById("mynickname").value;var to_user = document.getElementById("to_user").value;var send_str = {from_user: from_user,to_user: to_user,message: message};ws.send(JSON.stringify(send_str));var p = document.createElement("p");p.style.cssText = "width: 400px;text-align: right";p.innerText = send_str.message + "<-我";document.getElementById("chat_list").appendChild(p);}</script></body>
</html>

?

?

websocket握手原理

import socket, base64, hashlibsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1', 9527))
sock.listen(5)
# 獲取客戶端socket對象
conn, address = sock.accept() # 阻塞
# 獲取客戶端的【握手】信息
data = conn.recv(1024)
print(data)"""
b'GET / HTTP/1.1\r\n
Host: 127.0.0.1:9527\r\n
Connection: Upgrade\r\n
Pragma: no-cache\r\n
Cache-Control: no-cache\r\n
Upgrade: websocket\r\n
Origin: http://localhost:63342\r\n
Sec-WebSocket-Version: 13\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Sec-WebSocket-Key: 176bkom1UAtHfS7MUYCwlQ==\r\n
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n\r\n'
"""
# 1.轉字符串 切片
# 2.轉字符串 正則
# 3.轉字符串 split("\r\n") - [] for []#
#
def get_headers(data):header_dict = {}header_str = data.decode("utf8")for i in header_str.split("\r\n"):if str(i).startswith("Sec-WebSocket-Key"):header_dict["Sec-WebSocket-Key"] = i.split(":")[1].strip()return header_dictheaders = get_headers(data)  # 提取請求頭信息
# # 對請求頭中的sec-websocket-key進行加密
swk = headers['Sec-WebSocket-Key']
# Websocket 中的魔法字符串 magic_string
magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
value = swk + magic_string
# 176bkom1UAtHfS7MUYCwlQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
# ZWHsGUn8ogDGd+JYzQunlQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
# dFRV9m2/6PWawNWYUkRHDw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
ac = base64.b64encode(hashlib.sha1(value.encode('utf-8')).digest())
print(value)
print(ac)
# b'PIj4+UWLuqcpcTZcMnnu9Ik6rSQ='
# b'iZFEC+HI/NqNp5g2BoENbywWBLA='
# b'LXO3G84XmpR7crmJcZFaLPUDVHU='

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://127.0.0.1:9527\r\n\r\n"response_str = response_tpl % (ac.decode('utf-8'))
# 響應【握手】信息
conn.send(response_str.encode("utf8"))while True:msg = conn.recv(8096)print(msg)import websocket加密conn.send(websocket加密.res())
# # magic string為:258EAFA5-E914-47DA-95CA-C5AB0DC85B11
#

?

websocket解密

# b'\x81\x83\xceH\xb6\x85\xffz\x85'

hashstr = b'\x81\x8c\xc2J\xb3\x0c\xaa/\xdf`\xadj\xc4c\xb0&\xd7-'
# b'\x81    \x8c    \xc2J\xb3\x0c\xaa/\xdf`\xadj\xc4c\xb0&\xd7-'
ssss = b'\x81\xfe\x0bp\x8fF\xa1\xa3j\xc3)F7\xdbD+\x14\xa2\x199i\xda\x0bF\x02\xccI#\x03\xa2\x19\x0ef\xc72F;\xefG\r\r\xa9\x1d/k\xfd+F+\xefE\x1b\x04\xa2\x19*j\xce\'L3\xcaF8\x05\xa3\x16=h\xd0\x13F3\xccN\x1f\x03\xa0\x0c\x07g\xe9;F\x02\xf7G#*\xa3\x0c;k\xfc\x00G6\xcdF\x04\x04\xa2\x18<l\xc6#D\x0b\xf0E\x1d\x02\xa3,\x08k\xff*K\x08\xe5E\x1b\x02\xa0&+k\xfc/F\t\xc3N\x1f\x03\xa3\x1e\x03j\xf96G6\xcdD\x00$\xa3\x1e;g\xfc\nG5\xc8D\x07\x19\xae!&`\xfa-D\x14\xd0I\x1c2\xa3$+j\xfe<G6\xcdG\r\x05\xaf $`\xfa-E#\xf4G)*\xa2\x18(k\xfc/J\x16\xddE\x1b\x04\xa2\x18<l\xc6#K \xdcD\r\x13\xa3\x1d#j\xfa\x01F\x13\xe5D3#\xa9\x1d/k\xfd\x04F\n\xcfD&\x07\xa3\x19>f\xc76F1\xf1N\x1f\x03\xa0 \x01j\xfa9F0\xd1D\x00$\xa2\x18(i\xf65L3\xcaE\x1b\x02\xa3\x0f?j\xe0%K\x08\xecI,=\xae7\'`\xfa-G6\xcdI\x14 \xa2\x18<`\xfa-F\n\xceD\x1b\x12\xa3)8k\xfe;E\x13\xecD.\x05\xae!/k\xfe\x0cJ\x0e\xd5D\x17&\xa0\x0f!`\xfa-G4\xccD\x07&\xa2\x19(k\xfe(F\x07\xc0N\x1f\x03\xa1:)j\xf1?D\x19\xf4D\x1f\x05\xa9\x1d/i\xeb\x05K \xdcD.>\xa0!\x06j\xeb9G5\xe7E\x1a\x04\xa1\x06(k\xff>@\x0f\xc4F\'9\xa2\x1f.j\xcb\nG6\xcdI$,\xa2\x19.i\xc1)G5\xc8D%\n\xa9\x1d/j\xf9\x01F0\xd1E\x1a\x04\xa3\x02\x08j\xf99K5\xedE\x19\x01\xa3\x055g\xc6$L3\xcaF8\x19\xae\x1e\x1ej\xc3)F7\xdbE\x1a\x04\xa0\x0f)f\xc7&L3\xcaG\x0f=\xa0+\x06k\xff*G5\xc8H:\x14\xa2\x19(k\xff>@\x0f\xc4I\x0c\x15\xa3\x0f?j\xfa!F3\xe6D?,\xa31\x0fh\xc2\x17G1\xcbD\x1f\x1a\xa37\x18j\xe2\x10F\x02\xedE\x1a\x04\xae&\x00k\xfe,E\x08\xceE\x19\x01\xa3\'&`\xfa-F0\xe6D\x1c\x18\xa2\x18(j\xe5\nF0\xdeI\x19$\xa2\x1b-j\xe27K\x0f\xc3N\x1f\x03\xa1:5g\xf9\x1cF\n\xceD\x1b\x12\xa2\x18(i\xe8+J\x0e\xc1N\x1f\x03\xa0\r\x11i\xcc\x04G6\xcdE\x19\x01\xaf88k\xfe*G6\xd9B#\r\xae\x0e9j\xe8=F3\xc6D\x1f/\xa3=\x00j\xd6\rL3\xcaE\x18*\xa3$*j\xc3)F7\xdbH"\x18\xa3\x1f\x14`\xfa-E\x0e\xe4D\x1f\x17\xa3\x1e4j\xe5\nG6\xcdG\x13\x1b\xa9\x1d/k\xfe,F!\xdaD\x05\x0b\xae&\tg\xc9\x13K\x19\xc2N\x1f\x03\xa3\x1d6j\xd0\x1aF+\xf7E\x1a\x06\xa9\x1d/k\xfd\x04F.\xd8D\x1c/\xae\x11,k\xff*K8\xe9E\x1a\x10\xa9\x1d/`\xfa-G7\xcbD\r\x13\xa3\x07\'g\xc1\x0bK\x00\xf4I5\x0b\xa9\x1d/j\xfa4F\x19\xfdN\x1f\x03\xa2\x1a\x06j\xc3(F\n\xceD\x1b\x12\xaf 4j\xf8\x16L3\xcaG"-\xa3\x1d;j\xf96F,\xedE\x1a\x04\xa0\x117`\xfa-G7\xcbD\r\x13\xa3\x07\'g\xc1\x0bK\x00\xf4I5\x0b\xa9\x1d/j\xfa4F\x19\xfdD\x07>\xa2\x18*`\xfa-G4\xe3D\x02\x11\xa3\x1e\x03g\xf6.G6\xcdI\x14 \xa2\x18<`\xfa-F\n\xceD\x1b\x12\xa3)8k\xfe;E\x13\xecD.\x05\xae!/k\xfe\x0cJ\x0e\xd5D\x17&\xa0\x0f!`\xfa-G4\xccD\x07&\xa2\x19(k\xfe(F\x07\xc0N\x1f\x03\xa1:)j\xf1?D\x19\xf4D\x1f\x05\xa9\x1d/i\xeb\x05K \xdcD.>\xa0!\x06j\xeb9G5\xe7E\x1a\x04\xa1\x06(k\xff>@\x0f\xc4F\'9\xa2\x1f.j\xcb\nG6\xcdI$,\xa2\x19.i\xc1)G5\xc8D%\n\xa9\x1d/j\xf9\x01F0\xd1E\x1a\x04\xa3\x02\x08j\xf99K5\xedE\x19\x01\xa3\x055g\xc6$L3\xcaF8\x19\xae\x1e\x1ej\xc3)F7\xdbF\'9\xa2\x1f.j\xfa4F\x19\xfdD\x07>\xa3,\x08k\xff*K\x08\xe5E\x1b\x02\xa0&+k\xfc/F\t\xc3N\x1f\x03\xa3\x1e\x03j\xf96G6\xcdD\x00$\xa3\x1e;g\xfc\nG5\xc8D\x07\x19\xae!&`\xfa-D\x14\xd0I\x1c2\xa3$+j\xfe<G6\xcdG\r\x05\xaf $`\xfa-E#\xf4G)*\xa2\x18(k\xfc/J\x16\xddE\x1b\x04\xa2\x18<l\xc6#K \xdcD\r\x13\xa3\x1d#j\xfa\x01F\x13\xe5D3#\xa9\x1d/k\xfd\x04F\n\xcfD&\x07\xa3\x19>f\xc76F1\xf1N\x1f\x03\xa0 \x01j\xfa9F0\xd1D\x00$\xa2\x18(i\xf65L3\xcaE\x1b\x02\xa3\x0f?j\xe0%K\x08\xecI,=\xae7\'`\xfa-F3\xd3D54\xa3\x05\x12k\xff(L3\xcaE\x18*\xa3\x00=j\xf9\x01K?\xc9E\x1a\x04\xae\x16\x0ck\xff>L3\xcaN\x1f\x03\xa2\x19.j\xe8=F)\xc2I$%\xae.\x11g\xd0%L3\xcaD\x1f\x1a\xa37\x18k\xff*E!\xccH"\x08\xa9\x1d/i\xea\x13E\x05\xe3E\x1a\x04\xa2\x1b-f\xdf:G7\xcdE\x1a\x10\xa5!!g\xe9;F!\xdaD\x1f\x0f\xa3\x1d\x03j\xda\x02F\x1f\xeaN\x1f\x03\xa2\x1a\x06j\xc3(F\n\xceD\x1b\x12\xaf 4j\xf8\x16L3\xcaG"-\xa3\x1d;j\xf96F,\xedE\x1a\x04\xa0\x117`\xfa-G7\xcbD\r\x13\xa3\x07\'g\xc1\x0bK\x00\xf4I5\x0b\xa9\x1d/j\xfa4F\x19\xfdD\x07>\xa2\x18*`\xfa-G4\xe3D\x02\x11\xa3\x1e\x03g\xf6.G6\xcdI\x14 \xa2\x18<`\xfa-F\n\xceD\x1b\x12\xa3)8k\xfe;E\x13\xecD.\x05\xae!/k\xfe\x0cJ\x0e\xd5D\x17&\xa0\x0f!`\xfa-G4\xccD\x07&\xa2\x19(k\xfe(F\x07\xc0N\x1f\x03\xa1:)j\xf1?D\x19\xf4D\x1f\x05\xa9\x1d/i\xeb\x05K \xdcD.>\xa0!\x06j\xeb9G5\xe7E\x1a\x04\xa1\x06(k\xff>@\x0f\xc4F\'9\xa2\x1f.j\xfa4F\x19\xfdD\x07>\xa3,\x08k\xff*K\x08\xe5E\x1b\x02\xa0&+k\xfc/F\t\xc3N\x1f\x03\xa3\x1e\x03j\xf96G6\xcdD\x00$\xa3\x1e;g\xfc\nG5\xc8D\x07\x19\xae!&`\xfa-D\x14\xd0I\x1c2\xa3$+j\xfe<G6\xcdG\r\x05\xaf $`\xfa-E#\xf4G)*\xa2\x18(k\xfc/J\x16\xddE\x1b\x04\xa2\x18<l\xc6#K \xdcD\r\x13\xa3\x1d#j\xfa\x01F\x13\xe5D3#\xa9\x1d/k\xfd\x04F\n\xcfD&\x07\xa3\x19>f\xc76F1\xf1N\x1f\x03\xa0 \x01j\xfa9F0\xd1D\x00$\xa2\x18(i\xf65L3\xcaE\x1b\x02\xa3\x0f?j\xe0%K\x08\xecI,=\xae7\'`\xfa-F3\xd3D54\xa3\x05\x12k\xff(L3\xcaE\x18*\xa3\x00=j\xf9\x01K?\xc9E\x1a\x04\xae\x16\x0ck\xff>L3\xcaN\x1f\x03\xa2\x19.j\xe8=F)\xc2I$%\xae.\x11g\xd0%L3\xcaD\x1f\x1a\xa37\x18j\xe2\x10G6\xcfN\x1f\x03\xa2\x1a\x06j\xe7?F0\xe6I\x13\x00\xa2\x18(g\xf1\x0eG6\xd9N\x1f\x03\xa3$+j\xfe<F\x07\xddE\x1b\x15\xa0=\tj\xcb+K\x0f\xcaE\x1b"\xaf 0j\xf2\x08E!\xc4N\x1f\x03\xa2\x1a)j\xe2\x08G7\xcdE\x1b\x06\xa3)%`\xfa-D\x14\xccD\x14\x11\xa17\x11j\xfa+L3\xcaG\x0e+\xae\x0e9j\xcb\x10E\x0f\xe3D\x0e\x17\xa2\x1b\x02k\xff*D(\xcdE\x1a\x10\xa5!!h\xc2\x17G1\xcbD.$\xa2\x18(g\xc1\x02G7\xcbG$\x07\xa2\x1b-j\xc0$L3\xcaD\x1c/\xa3\x1e4k\xff*F,\xedD\x1c\x17\xae\x1b\x08k\xfc/F+\xd0I#\n\xa9\x1d/h\xdd7K0\xfbD&\x07\xa3\x19>k\xff*E!\xccH"\x08\xa9\x1d/i\xea\x13E\x05\xe3E\x1a\x04\xa2\x1b-f\xdf:G7\xcdE\x1a\x10\xa5!!g\xe9;F!\xdaD\x1f\x0f\xa3\x1d\x03j\xda\x02F\x1f\xeaN\x1f\x03\xa2\x1a\x06j\xc3(F\n\xceD\x1b\x12\xaf 4j\xf8\x16L3\xcaG"-\xa3\x1d;j\xf96F,\xedE\x1a\x04\xa0\x117`\xfa-G7\xcbD\r\x13\xa3\x07\'g\xc1\x0bK\x00\xf4I5\x0b\xa9\x1d/j\xfa4F\x19\xfdD\x07>\xa2\x18*`\xfa-G4\xe3D\x02\x11\xa3\x1e\x03g\xf6.G6\xcdI\x14 \xa2\x18<`\xfa-F\n\xceD\x1b\x12\xa3)8k\xfe;E\x13\xecD.\x05\xae!/k\xfe\x0cJ\x0e\xd5D\x17&\xa0\x0f!`\xfa-G4\xccD\x07&\xa2\x19(k\xfe(F\x07\xc0N\x1f\x03\xa1:)j\xf1?D\x19\xf4D\x1f\x05\xa9\x1d/i\xeb\x05K \xdcD.>\xa0!\x06j\xeb9G5\xe7E\x1a\x04\xa1\x06(k\xff>@\x0f\xc4F\'9\xa2\x1f.j\xcb\nG6\xcdI$,\xa2\x19.i\xc1)G5\xc8D%\n\xa9\x1d/j\xf9\x01F0\xd1E\x1a\x04\xa3\x02\x08j\xf99K5\xedE\x1a\x06\xa9\x1d/k\xfd\x04F\n\xcfD&\x07\xa3\x19>f\xc76F1\xf1N\x1f\x03\xa0 \x01j\xfa9F0\xd1D\x00$\xa2\x18(i\xf65L3\xcaE\x1b\x02\xa3\x0f?j\xe0%K\x08\xecI,=\xae7\'`\xfa-F3\xd3D54\xa3\x05\x12k\xff(L3\xcaE\x18*\xa3\x00=j\xf9\x01K?\xc9E\x1a\x04\xae\x16\x0ck\xff>L3\xcaD&\x07\xa3\x19>j\xce:G7\xdcG?%\xa3,)g\xc6-G7\xebH"\x1c\xa3\x15\ni\xe8#L3\xcaE\x18\x05\xa3\x05\nk\xfe*G7\xcfD+\t\xa9\x1d/h\xdd+F8\xd8F5=\xa3\x1d)`\xfa-E"\xe2I\x0c\x15\xa3,\x12i\xc6\x04F"\xdeE\x19.\xa2\x18(h\xe1*G6\xd9B#\r\xa1%\x15k\xf8,F\x02\xedE\x1a\x04\xae&\x00k\xfe,E\x08\xceE\x19\x01\xa3\'&`\xfa-F0\xe6D\x1c\x18\xa2\x18(j\xe5\nF0\xdeI\x19$\xa2\x1b-j\xe27K\x0f\xc3N\x1f\x03\xa1:5g\xf9\x1cF\n\xceD\x1b\x12\xa2\x18(i\xe8+J\x0e\xc1N\x1f\x03\xa0\r\x11i\xcc\x04G6\xcdE\x19\x01\xaf88k\xfe*G6\xd9B#\r\xae\x0e9j\xe8=F3\xc6D\x1f/\xa3=\x00j\xd6\rL3\xcaE\x18*\xa3$*j\xc3)F7\xdbH"\x18\xa3\x1f\x14`\xfa-E\x0e\xe4D\x1f\x17\xa3\x1e4j\xe5\nG6\xcdG\x13\x1b\xa9\x1d/k\xfe,F!\xdaD\x05\x0b\xae&\tg\xc9\x13K\x19\xc2N\x1f\x03\xa3\x1d6j\xd0\x1aF+\xf7E\x1a\x06\xa9\x1d/k\xfd\x04F.\xd8D\x1c/\xae\x11,k\xff*K8\xe9E\x1a\x10\xa9\x1d/j\xc3)F7\xdbD+\x14\xa2\x199i\xda\x0bF\x02\xccI#\x03\xa2\x19\x0ef\xc72F;\xefG\r\r\xa9\x1d/k\xfd+F+\xefE\x1b\x04\xa2\x19*j\xce\'L3\xcaF8\x05\xa3\x16=h\xd0\x13F3\xccN\x1f\x03\xa0\x0c\x07g\xe9;F\x02\xf7G#*\xa3\x0c;k\xfc\x00G6\xcdF\x04\x04\xa2\x18<l\xc6#F.\xd8D\x1c/\xae\x11,'print(ssss[2:4])  # == 140
# 與127做 與 位運算 12# Websocket 加密 解密 3種情況
# 校驗位 : 由websocket加密字符串的第二個字節與127期開始進行與位運算
# 校驗位 == 127
# 校驗位 == 126
# 校驗位 <= 125# 將第二個字節也就是 \x83 第9-16位 進行與127進行位運算
payload = hashstr[1] & 127
print(payload)
if payload == 127:extend_payload_len = hashstr[2:10]  # 15.5ZBmask = hashstr[10:14]decoded = hashstr[14:]
# 當位運算結果等于127時,則第3-10個字節為數據長度
# 第11-14字節為mask 解密所需字符串
# 則數據為第15字節至結尾# ssss = b'\x81\xfe\x0bp\x8fF\xa1\xa3j\xc3)F7\xdbD+\x14\xa2\x199i\xda\x0bF\x02\xccI#\x03\xa2\x19\x0ef\xc72F;\xefG\r\r\xa9\x1d/k\xfd+F+\xefE\x1b\x04\xa2\x19*j\xce\'L3\xcaF8\x05\xa3\x16=h\xd0\x13F3\xccN\x1f\x03\xa0\x0c\x07g\xe9;F\x02\xf7G#*\xa3\x0c;k\xfc\x00G6\xcdF\x04\x04\xa2\x18<l\xc6#D\x0b\xf0E\x1d\x02\xa3,\x08k\xff*K\x08\xe5E\x1b\x02\xa0&+k\xfc/F\t\xc3N\x1f\x03\xa3\x1e\x03j\xf96G6\xcdD\x00$\xa3\x1e;g\xfc\nG5\xc8D\x07\x19\xae!&`\xfa-D\x14\xd0I\x1c2\xa3$+j\xfe<G6\xcdG\r\x05\xaf $`\xfa-E#\xf4G)*\xa2\x18(k\xfc/J\x16\xddE\x1b\x04\xa2\x18<l\xc6#K \xdcD\r\x13\xa3\x1d#j\xfa\x01F\x13\xe5D3#\xa9\x1d/k\xfd\x04F\n\xcfD&\x07\xa3\x19>f\xc76F1\xf1N\x1f\x03\xa0 \x01j\xfa9F0\xd1D\x00$\xa2\x18(i\xf65L3\xcaE\x1b\x02\xa3\x0f?j\xe0%K\x08\xecI,=\xae7\'`\xfa-G6\xcdI\x14 \xa2\x18<`\xfa-F\n\xceD\x1b\x12\xa3)8k\xfe;E\x13\xecD.\x05\xae!/k\xfe\x0cJ\x0e\xd5D\x17&\xa0\x0f!`\xfa-G4\xccD\x07&\xa2\x19(k\xfe(F\x07\xc0N\x1f\x03\xa1:)j\xf1?D\x19\xf4D\x1f\x05\xa9\x1d/i\xeb\x05K \xdcD.>\xa0!\x06j\xeb9G5\xe7E\x1a\x04\xa1\x06(k\xff>@\x0f\xc4F\'9\xa2\x1f.j\xcb\nG6\xcdI$,\xa2\x19.i\xc1)G5\xc8D%\n\xa9\x1d/j\xf9\x01F0\xd1E\x1a\x04\xa3\x02\x08j\xf99K5\xedE\x19\x01\xa3\x055g\xc6$L3\xcaF8\x19\xae\x1e\x1ej\xc3)F7\xdbE\x1a\x04\xa0\x0f)f\xc7&L3\xcaG\x0f=\xa0+\x06k\xff*G5\xc8H:\x14\xa2\x19(k\xff>@\x0f\xc4I\x0c\x15\xa3\x0f?j\xfa!F3\xe6D?,\xa31\x0fh\xc2\x17G1\xcbD\x1f\x1a\xa37\x18j\xe2\x10F\x02\xedE\x1a\x04\xae&\x00k\xfe,E\x08\xceE\x19\x01\xa3\'&`\xfa-F0\xe6D\x1c\x18\xa2\x18(j\xe5\nF0\xdeI\x19$\xa2\x1b-j\xe27K\x0f\xc3N\x1f\x03\xa1:5g\xf9\x1cF\n\xceD\x1b\x12\xa2\x18(i\xe8+J\x0e\xc1N\x1f\x03\xa0\r\x11i\xcc\x04G6\xcdE\x19\x01\xaf88k\xfe*G6\xd9B#\r\xae\x0e9j\xe8=F3\xc6D\x1f/\xa3=\x00j\xd6\rL3\xcaE\x18*\xa3$*j\xc3)F7\xdbH"\x18\xa3\x1f\x14`\xfa-E\x0e\xe4D\x1f\x17\xa3\x1e4j\xe5\nG6\xcdG\x13\x1b\xa9\x1d/k\xfe,F!\xdaD\x05\x0b\xae&\tg\xc9\x13K\x19\xc2N\x1f\x03\xa3\x1d6j\xd0\x1aF+\xf7E\x1a\x06\xa9\x1d/k\xfd\x04F.\xd8D\x1c/\xae\x11,k\xff*K8\xe9E\x1a\x10\xa9\x1d/`\xfa-G7\xcbD\r\x13\xa3\x07\'g\xc1\x0bK\x00\xf4I5\x0b\xa9\x1d/j\xfa4F\x19\xfdN\x1f\x03\xa2\x1a\x06j\xc3(F\n\xceD\x1b\x12\xaf 4j\xf8\x16L3\xcaG"-\xa3\x1d;j\xf96F,\xedE\x1a\x04\xa0\x117`\xfa-G7\xcbD\r\x13\xa3\x07\'g\xc1\x0bK\x00\xf4I5\x0b\xa9\x1d/j\xfa4F\x19\xfdD\x07>\xa2\x18*`\xfa-G4\xe3D\x02\x11\xa3\x1e\x03g\xf6.G6\xcdI\x14 \xa2\x18<`\xfa-F\n\xceD\x1b\x12\xa3)8k\xfe;E\x13\xecD.\x05\xae!/k\xfe\x0cJ\x0e\xd5D\x17&\xa0\x0f!`\xfa-G4\xccD\x07&\xa2\x19(k\xfe(F\x07\xc0N\x1f\x03\xa1:)j\xf1?D\x19\xf4D\x1f\x05\xa9\x1d/i\xeb\x05K \xdcD.>\xa0!\x06j\xeb9G5\xe7E\x1a\x04\xa1\x06(k\xff>@\x0f\xc4F\'9\xa2\x1f.j\xcb\nG6\xcdI$,\xa2\x19.i\xc1)G5\xc8D%\n\xa9\x1d/j\xf9\x01F0\xd1E\x1a\x04\xa3\x02\x08j\xf99K5\xedE\x19\x01\xa3\x055g\xc6$L3\xcaF8\x19\xae\x1e\x1ej\xc3)F7\xdbF\'9\xa2\x1f.j\xfa4F\x19\xfdD\x07>\xa3,\x08k\xff*K\x08\xe5E\x1b\x02\xa0&+k\xfc/F\t\xc3N\x1f\x03\xa3\x1e\x03j\xf96G6\xcdD\x00$\xa3\x1e;g\xfc\nG5\xc8D\x07\x19\xae!&`\xfa-D\x14\xd0I\x1c2\xa3$+j\xfe<G6\xcdG\r\x05\xaf $`\xfa-E#\xf4G)*\xa2\x18(k\xfc/J\x16\xddE\x1b\x04\xa2\x18<l\xc6#K \xdcD\r\x13\xa3\x1d#j\xfa\x01F\x13\xe5D3#\xa9\x1d/k\xfd\x04F\n\xcfD&\x07\xa3\x19>f\xc76F1\xf1N\x1f\x03\xa0 \x01j\xfa9F0\xd1D\x00$\xa2\x18(i\xf65L3\xcaE\x1b\x02\xa3\x0f?j\xe0%K\x08\xecI,=\xae7\'`\xfa-F3\xd3D54\xa3\x05\x12k\xff(L3\xcaE\x18*\xa3\x00=j\xf9\x01K?\xc9E\x1a\x04\xae\x16\x0ck\xff>L3\xcaN\x1f\x03\xa2\x19.j\xe8=F)\xc2I$%\xae.\x11g\xd0%L3\xcaD\x1f\x1a\xa37\x18k\xff*E!\xccH"\x08\xa9\x1d/i\xea\x13E\x05\xe3E\x1a\x04\xa2\x1b-f\xdf:G7\xcdE\x1a\x10\xa5!!g\xe9;F!\xdaD\x1f\x0f\xa3\x1d\x03j\xda\x02F\x1f\xeaN\x1f\x03\xa2\x1a\x06j\xc3(F\n\xceD\x1b\x12\xaf 4j\xf8\x16L3\xcaG"-\xa3\x1d;j\xf96F,\xedE\x1a\x04\xa0\x117`\xfa-G7\xcbD\r\x13\xa3\x07\'g\xc1\x0bK\x00\xf4I5\x0b\xa9\x1d/j\xfa4F\x19\xfdD\x07>\xa2\x18*`\xfa-G4\xe3D\x02\x11\xa3\x1e\x03g\xf6.G6\xcdI\x14 \xa2\x18<`\xfa-F\n\xceD\x1b\x12\xa3)8k\xfe;E\x13\xecD.\x05\xae!/k\xfe\x0cJ\x0e\xd5D\x17&\xa0\x0f!`\xfa-G4\xccD\x07&\xa2\x19(k\xfe(F\x07\xc0N\x1f\x03\xa1:)j\xf1?D\x19\xf4D\x1f\x05\xa9\x1d/i\xeb\x05K \xdcD.>\xa0!\x06j\xeb9G5\xe7E\x1a\x04\xa1\x06(k\xff>@\x0f\xc4F\'9\xa2\x1f.j\xfa4F\x19\xfdD\x07>\xa3,\x08k\xff*K\x08\xe5E\x1b\x02\xa0&+k\xfc/F\t\xc3N\x1f\x03\xa3\x1e\x03j\xf96G6\xcdD\x00$\xa3\x1e;g\xfc\nG5\xc8D\x07\x19\xae!&`\xfa-D\x14\xd0I\x1c2\xa3$+j\xfe<G6\xcdG\r\x05\xaf $`\xfa-E#\xf4G)*\xa2\x18(k\xfc/J\x16\xddE\x1b\x04\xa2\x18<l\xc6#K \xdcD\r\x13\xa3\x1d#j\xfa\x01F\x13\xe5D3#\xa9\x1d/k\xfd\x04F\n\xcfD&\x07\xa3\x19>f\xc76F1\xf1N\x1f\x03\xa0 \x01j\xfa9F0\xd1D\x00$\xa2\x18(i\xf65L3\xcaE\x1b\x02\xa3\x0f?j\xe0%K\x08\xecI,=\xae7\'`\xfa-F3\xd3D54\xa3\x05\x12k\xff(L3\xcaE\x18*\xa3\x00=j\xf9\x01K?\xc9E\x1a\x04\xae\x16\x0ck\xff>L3\xcaN\x1f\x03\xa2\x19.j\xe8=F)\xc2I$%\xae.\x11g\xd0%L3\xcaD\x1f\x1a\xa37\x18j\xe2\x10G6\xcfN\x1f\x03\xa2\x1a\x06j\xe7?F0\xe6I\x13\x00\xa2\x18(g\xf1\x0eG6\xd9N\x1f\x03\xa3$+j\xfe<F\x07\xddE\x1b\x15\xa0=\tj\xcb+K\x0f\xcaE\x1b"\xaf 0j\xf2\x08E!\xc4N\x1f\x03\xa2\x1a)j\xe2\x08G7\xcdE\x1b\x06\xa3)%`\xfa-D\x14\xccD\x14\x11\xa17\x11j\xfa+L3\xcaG\x0e+\xae\x0e9j\xcb\x10E\x0f\xe3D\x0e\x17\xa2\x1b\x02k\xff*D(\xcdE\x1a\x10\xa5!!h\xc2\x17G1\xcbD.$\xa2\x18(g\xc1\x02G7\xcbG$\x07\xa2\x1b-j\xc0$L3\xcaD\x1c/\xa3\x1e4k\xff*F,\xedD\x1c\x17\xae\x1b\x08k\xfc/F+\xd0I#\n\xa9\x1d/h\xdd7K0\xfbD&\x07\xa3\x19>k\xff*E!\xccH"\x08\xa9\x1d/i\xea\x13E\x05\xe3E\x1a\x04\xa2\x1b-f\xdf:G7\xcdE\x1a\x10\xa5!!g\xe9;F!\xdaD\x1f\x0f\xa3\x1d\x03j\xda\x02F\x1f\xeaN\x1f\x03\xa2\x1a\x06j\xc3(F\n\xceD\x1b\x12\xaf 4j\xf8\x16L3\xcaG"-\xa3\x1d;j\xf96F,\xedE\x1a\x04\xa0\x117`\xfa-G7\xcbD\r\x13\xa3\x07\'g\xc1\x0bK\x00\xf4I5\x0b\xa9\x1d/j\xfa4F\x19\xfdD\x07>\xa2\x18*`\xfa-G4\xe3D\x02\x11\xa3\x1e\x03g\xf6.G6\xcdI\x14 \xa2\x18<`\xfa-F\n\xceD\x1b\x12\xa3)8k\xfe;E\x13\xecD.\x05\xae!/k\xfe\x0cJ\x0e\xd5D\x17&\xa0\x0f!`\xfa-G4\xccD\x07&\xa2\x19(k\xfe(F\x07\xc0N\x1f\x03\xa1:)j\xf1?D\x19\xf4D\x1f\x05\xa9\x1d/i\xeb\x05K \xdcD.>\xa0!\x06j\xeb9G5\xe7E\x1a\x04\xa1\x06(k\xff>@\x0f\xc4F\'9\xa2\x1f.j\xcb\nG6\xcdI$,\xa2\x19.i\xc1)G5\xc8D%\n\xa9\x1d/j\xf9\x01F0\xd1E\x1a\x04\xa3\x02\x08j\xf99K5\xedE\x1a\x06\xa9\x1d/k\xfd\x04F\n\xcfD&\x07\xa3\x19>f\xc76F1\xf1N\x1f\x03\xa0 \x01j\xfa9F0\xd1D\x00$\xa2\x18(i\xf65L3\xcaE\x1b\x02\xa3\x0f?j\xe0%K\x08\xecI,=\xae7\'`\xfa-F3\xd3D54\xa3\x05\x12k\xff(L3\xcaE\x18*\xa3\x00=j\xf9\x01K?\xc9E\x1a\x04\xae\x16\x0ck\xff>L3\xcaD&\x07\xa3\x19>j\xce:G7\xdcG?%\xa3,)g\xc6-G7\xebH"\x1c\xa3\x15\ni\xe8#L3\xcaE\x18\x05\xa3\x05\nk\xfe*G7\xcfD+\t\xa9\x1d/h\xdd+F8\xd8F5=\xa3\x1d)`\xfa-E"\xe2I\x0c\x15\xa3,\x12i\xc6\x04F"\xdeE\x19.\xa2\x18(h\xe1*G6\xd9B#\r\xa1%\x15k\xf8,F\x02\xedE\x1a\x04\xae&\x00k\xfe,E\x08\xceE\x19\x01\xa3\'&`\xfa-F0\xe6D\x1c\x18\xa2\x18(j\xe5\nF0\xdeI\x19$\xa2\x1b-j\xe27K\x0f\xc3N\x1f\x03\xa1:5g\xf9\x1cF\n\xceD\x1b\x12\xa2\x18(i\xe8+J\x0e\xc1N\x1f\x03\xa0\r\x11i\xcc\x04G6\xcdE\x19\x01\xaf88k\xfe*G6\xd9B#\r\xae\x0e9j\xe8=F3\xc6D\x1f/\xa3=\x00j\xd6\rL3\xcaE\x18*\xa3$*j\xc3)F7\xdbH"\x18\xa3\x1f\x14`\xfa-E\x0e\xe4D\x1f\x17\xa3\x1e4j\xe5\nG6\xcdG\x13\x1b\xa9\x1d/k\xfe,F!\xdaD\x05\x0b\xae&\tg\xc9\x13K\x19\xc2N\x1f\x03\xa3\x1d6j\xd0\x1aF+\xf7E\x1a\x06\xa9\x1d/k\xfd\x04F.\xd8D\x1c/\xae\x11,k\xff*K8\xe9E\x1a\x10\xa9\x1d/j\xc3)F7\xdbD+\x14\xa2\x199i\xda\x0bF\x02\xccI#\x03\xa2\x19\x0ef\xc72F;\xefG\r\r\xa9\x1d/k\xfd+F+\xefE\x1b\x04\xa2\x19*j\xce\'L3\xcaF8\x05\xa3\x16=h\xd0\x13F3\xccN\x1f\x03\xa0\x0c\x07g\xe9;F\x02\xf7G#*\xa3\x0c;k\xfc\x00G6\xcdF\x04\x04\xa2\x18<l\xc6#F.\xd8D\x1c/\xae\x11,'
if payload == 126:extend_payload_len = hashstr[2:4]  # \x0bp\x8fF  65535 字節 21845個漢字mask = hashstr[4:8]  # xa1\xa3j\xc3)F7decoded = hashstr[8:]  # 從第九個開始全是數據
# 當位運算結果等于126時,則第3-4個字節為數據長度
# 第5-8字節為mask 解密所需字符串
# 則數據為第9字節至結尾# hashstr = b'\x81\x8c\xc2J\xb3\x0c\xaa/\xdf`\xadj\xc4c\xb0&\xd7-'  12
if payload <= 125:extend_payload_len = Nonemask = hashstr[2:6]  # \xc2J\xb3\x0c\xaadecoded = hashstr[6:]  # /\xdf`\xadj\xc4c\xb0&\xd7-# 當位運算結果小于等于125時,則這個數字12就是數據的長度
# 第3-6字節為mask 解密所需字符串
# 則數據為第7字節至結尾

str_byte = bytearray()
# mask_len = 4
# [0,1,2,3]
for i in range(len(decoded)): # 12 - 0 1 2 3 4 5 6 7 8 9 10 11byte = decoded[i] ^ mask[i % 4] # i=0
    str_byte.append(byte)print(str_byte.decode("utf8"))

?

?

websocket加密

import structdef res():msg_bytes = "hello".encode("utf8")token = b"\x81"length = len(msg_bytes) # 5if length < 126:token += struct.pack("B", length)elif length == 126:token += struct.pack("!BH", 126, length)else:token += struct.pack("!BQ", 127, length)msg = token + msg_bytesprint(msg)return msg

?

轉載于:https://www.cnblogs.com/yb-guanxin/p/10713498.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248132.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248132.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248132.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jQuery第一天

課程回顧&#xff1a; ? 正則&#xff1a;匹配字符組合模式; ? 創建&#xff1a;var reg1 new RegExp(/abc/); var reg2 /abc/; ? 測試&#xff1a;reg1.test(‘abc’); ? 特殊字符&#xff1a;元字符 ? 邊界符&#xff1a;^&#xff0c;$ ? 字符類&#xff1a;[…

Python學習(一)

一、版本&#xff1a; Python2.X /Python3.x 官方宣布2020 年 1 月 1 日&#xff0c; 停止 Python 2 的更新。 Python3.x不兼容Python2.x  二、安裝&#xff08;以mac 為例&#xff09; MAC 系統一般都自帶有 Python2.x版本 的環境&#xff0c;你也可以在鏈接 https://www.py…

jQuery—淘寶精品服飾案例

<body><div class"wrapper"><ul id"left"><li><a href"#">女靴</a></li><li><a href"#">雪地靴</a></li><li><a href"#">冬裙</a>&l…

Python機器學習實踐:決策樹判別汽車金融違約用戶

文章發布于公號【數智物語】 &#xff08;ID&#xff1a;decision_engine&#xff09;&#xff0c;關注公號不錯過每一篇干貨。 轉自 | 法納斯特&#xff08;公眾號ID:walker398&#xff09; 作者 | 小F 決策樹呈樹形結構&#xff0c;是一種基本的回歸和分類方法。 決策樹模型的…

Python學習(二)語言基礎

一、變量與類型 在程序設計中&#xff0c;變量是一種存儲數據的載體 整型&#xff1a;Python中可以處理任意大小的整數浮點型&#xff1a;浮點數也就是小數字符串型&#xff1a;字符串是以單引號或雙引號括起來的任意文本布爾型&#xff1a;布爾值只有True、False兩種值&#x…

jQuery—tab欄切換

<div class"tab"><div class"tab_list"><ul><li class"current">商品介紹</li><li>規格與包裝</li><li>售后保障</li><li>商品評價&#xff08;50000&#xff09;</li><l…

MongoDB分組查詢,聚合查詢,以及復雜查詢

準備數據 from pymongo import MongoClient import datetimeclientMongoClient(mongodb://localhost:27017) tableclient[db1][emp]l[ (張飛,male,18,20170301,,7300.33,401,1), #以下是教學部 (張云,male,78,20150302,teacher,1000000.31,401,1), (劉備,male,81,20130305,teac…

Python學習(三)基礎

一、函數與模塊 定義函數&#xff1a; 函數代碼塊以 def 關鍵詞開頭&#xff0c;后接函數標識符名稱和圓括號 ()。任何傳入參數和自變量必須放在圓括號中間&#xff0c;圓括號之間可以用于定義參數。函數的第一行語句可以選擇性地使用文檔字符串—用于存放函數說明。函數內容以…

操作系統原理之I/O設備管理(第六章上半部分)

一、I/O系統的組成 I/O系統不僅包括各種I/O設備&#xff0c;還包括與設備相連的設備控制器&#xff0c;有些系統還配備了專?? 于輸?/輸出控制的專?計算機&#xff0c;即通道。此外&#xff0c;I/O系統要通過總線與CPU、內存相連。 I/O系統的結構&#xff1a; I/O設備的分類…

js控制a標簽點擊事件 觸發下載

問題背景&#xff0c;動態獲取data把url賦值到a標簽的url中&#xff0c;讓a標簽自動下載 首先想到的應該是$(xxx).click(), 查資料明白&#xff1a;js中的$(...).click()事件只能觸發綁定的onClick方法&#xff0c;不能跳轉到href。 第二種方法&#xff1a;獲取到url之后locat…

操作系統原理之I/O設備管理(第六章下半部分)

五、I/O軟件原理 輸入輸出軟件的總體目標是將軟件組織成一種層次結構 低層軟件用來屏蔽硬件的具體細節高層軟件則主要是為用戶提供一個簡潔、規范的界面設備管理的4個層次&#xff1a; 用戶層軟件 -》向系統發出I/O請求&#xff0c;顯示I/O操作的結果&#xff0c;提供?戶與設備…

jQuery第二天

課程回顧&#xff1a; ? jQuery&#xff1a;JavaScript庫 ? 入口函數&#xff1a;$(function () {}); ? jQuery&#xff1a;jQuery對象&#xff0c;DOM對象 ? jQuery轉成DOM&#xff1a;$(‘元素’)[索引值] ? DOM轉成jQuery&#xff1a;$(DOM對象); ? 篩選方法&am…

切換Debug/Release編譯模式和Archive的作用

&#xfeff;在學這個之前&#xff0c;以為很難&#xff0c;也起不到什么作用&#xff0c;但是等真正運用到工程里面&#xff0c;才發現&#xff0c;這個能幫你省下很多工作量。 1&#xff0c;Debug和Release版本區別&#xff1f; 進行iOS開發&#xff0c;在Xcode調試程序時&am…

Linux 防火墻:Netfilter iptables

一、Netfilter 簡介 (1) Netfilter 是 Linux 內置的一種防火墻機制&#xff0c;我們一般也稱之為數據包過濾機制&#xff0c;而 iptables 只是操作 netfilter 的一個命令行工具(2) Netfilter 是 Linux CentOS 6 內置的防火墻機制&#xff0c;Firewall 是 Linux CentOS 7 內置的…

無法加載 DLL“SQLite.Interop.DLL”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。...

無法加載 DLL“SQLite.Interop.DLL”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。 在項目里添加 現有項 把SQLite.Interop.DLL文件添加進來&#xff0c;然后點擊屬性 修改一個屬性 把 屬性 復制到輸出目錄 改為 始終復制 然后打開你的項目屬性 進入生成的 頁面&a…

jQuery第三天

課程回顧&#xff1a; ? 動畫效果&#xff1a;基本動畫&#xff0c;滑動動畫&#xff0c;淡入淡出&#xff0c;自定義動畫效果(animate) ? 事件切換&#xff1a;hover(over&#xff0c;out); ? 停止動畫&#xff1a;stop ? 操作屬性&#xff1a;prop&#xff08;固有屬…

C語言程序設計II—第八周教學

第八周教學總結&#xff08;15/4-21/4&#xff09; 教學內容 本周的教學內容為&#xff1a;   8.4 電碼加密 知識點&#xff1a;指針與字符串&#xff0c;重難點&#xff1a;字符指針與字符串的關聯和區別&#xff1b;   8.5 任意個整數求和 知識點&#xff1a;動態內存分配…

AFNetworking 對數據進行https ssl加密

參考來源&#xff1a;http://www.cnblogs.com/jys509/p/5001566.html 現在在工作中的工作需求&#xff1a;https請求驗證證書一般來講如果app用了web service , 我們需要防止數據嗅探來保證數據安全.通常的做法是用ssl來連接以防止數據抓包和嗅探其實這么做的話還是不夠的 。…

數據庫系統原理(第一章概述)

一、數據庫基本概念 什么是數據&#xff1a;數據&#xff08;Data&#xff09;是描述事物的符號記錄&#xff0c;是指利用物理符號記錄下來的、 可以鑒別的信息。 數據是信息存在的一種形式&#xff0c;只有通過解釋或處理的數據才能成為有用的信息。 什么是數據庫&#xff1a;…

jQuery第四天

課程回顧&#xff1a; ? 元素操作&#xff1a; ? 遍歷元素&#xff1a; ? $(‘元素’).each(function (index, elm) {}); ? $.each(對象&#xff0c;function (index, elm) {}); ? 創建元素&#xff1a;$(‘ 新的元素?’);? 添加元素&#xff1a; ? 內部添加&…