色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

易語言WebSocket通訊源碼解析:握手、幀封裝與斷線重連

易語言WebSocket通訊源碼解析:握手、幀封裝與斷線重連 1. 為什么要在易語言里折騰WebSocket易語言這門語言圈內(nèi)人對(duì)它的感情挺復(fù)雜的。上手快、中文關(guān)鍵字、拖控件就能出界面做點(diǎn)小工具、上位機(jī)、內(nèi)部管理軟件效率極高。但一碰到網(wǎng)絡(luò)通訊尤其是長連接、實(shí)時(shí)推送這類需求很多人第一反應(yīng)就是易語言搞不定吧。我早年也這么想直到手上一個(gè)設(shè)備監(jiān)控項(xiàng)目必須做服務(wù)端主動(dòng)推送才硬著頭皮把WebSocket在易語言里從頭到尾擼了一遍。這篇東西就是那次折騰的完整復(fù)盤。核心講的是易語言WebSocket通訊源碼的解析從客戶端發(fā)起握手、協(xié)議幀的封裝與解析一直到斷線之后怎么自動(dòng)重連。適合兩類人看一類是手里有易語言項(xiàng)目、需要接入實(shí)時(shí)通訊但不想換語言的開發(fā)者另一類是想搞明白WebSocket底層到底怎么跑、不想只會(huì)調(diào)庫的同行。哪怕你用的是別的語言握手和幀格式這部分邏輯是通用的看懂了照樣能遷移。先把結(jié)論擺前面易語言做WebSocket完全可行難點(diǎn)不在語言本身而在于易語言沒有現(xiàn)成的原生Socket異步回調(diào)機(jī)制你得自己用多線程或者定時(shí)輪詢?nèi)ヲ?qū)動(dòng)收發(fā)。握手、掩碼、幀解析這些協(xié)議細(xì)節(jié)反而是死的照著RFC規(guī)范一步步來就行。真正讓人掉頭發(fā)的是斷線重連的狀態(tài)管理——什么時(shí)候算斷、重連幾次、重連期間消息怎么緩存這些才是源碼里最值錢的部分。我下面會(huì)按整體設(shè)計(jì)思路→協(xié)議細(xì)節(jié)拆解→實(shí)操實(shí)現(xiàn)→問題排查這個(gè)順序展開中間穿插我自己踩過的坑和參數(shù)選擇的依據(jù)。你如果只是想快速跑通可以直接跳到第3節(jié)的實(shí)操部分想徹底搞懂建議從頭看。2. 整體架構(gòu)設(shè)計(jì)與方案選型拆解2.1 為什么不用輪詢而選WebSocket項(xiàng)目背景是設(shè)備狀態(tài)監(jiān)控幾十臺(tái)設(shè)備每隔幾秒上報(bào)一次心跳和狀態(tài)數(shù)據(jù)服務(wù)端要實(shí)時(shí)匯總并推送到管理界面。最開始的方案是HTTP輪詢界面每隔兩秒發(fā)一次請(qǐng)求拉數(shù)據(jù)。實(shí)測(cè)下來問題很明顯一是延遲高最壞情況要等一個(gè)輪詢周期才能看到狀態(tài)變化二是無效請(qǐng)求多大部分輪詢返回的都是沒變化白白消耗連接資源三是每次HTTP請(qǐng)求都要重新建連雖然可以keep-alive但易語言的HTTP組件對(duì)長連接支持一般開銷不小。換成WebSocket之后一條TCP連接建立起來就一直掛著服務(wù)端有數(shù)據(jù)直接推客戶端收到就更新界面延遲從秒級(jí)降到毫秒級(jí)。這就是選WebSocket的核心理由全雙工、低延遲、連接復(fù)用。它不是銀彈如果只是偶爾查一次數(shù)據(jù)HTTP反而更簡單但只要涉及高頻、雙向、實(shí)時(shí)WebSocket的優(yōu)勢(shì)就壓不住了。這里有個(gè)選型細(xì)節(jié)值得說易語言生態(tài)里做WebSocket大致三條路。第一條是用現(xiàn)成的模塊或支持庫省事但黑盒出問題不好查第二條是調(diào)用系統(tǒng)自帶的WinHTTP/WinInet但這兩個(gè)對(duì)WebSocket的支持在舊系統(tǒng)上不完整第三條就是自己用Socket組件手?jǐn)]協(xié)議。我選的是第三條原因很直接——可控。設(shè)備監(jiān)控這種場(chǎng)景連接穩(wěn)定性比開發(fā)速度重要自己寫的代碼每一行都知道在干嘛斷線了能精確控制重連邏輯這是黑盒模塊給不了的。2.2 客戶端與服務(wù)端的職責(zé)劃分易語言在這套方案里主要承擔(dān)客戶端角色服務(wù)端我用的是另一套成熟框架這里不展開重點(diǎn)講客戶端。客戶端要干的事拆開看就四件建立TCP連接、完成WebSocket握手、維持心跳與收發(fā)幀、斷線后重連。這四件事對(duì)應(yīng)源碼里的四個(gè)核心模塊。連接模塊負(fù)責(zé)Socket的創(chuàng)建和連接握手模塊負(fù)責(zé)拼裝HTTP Upgrade請(qǐng)求并校驗(yàn)服務(wù)端返回幀處理模塊負(fù)責(zé)把業(yè)務(wù)數(shù)據(jù)封裝成WebSocket幀發(fā)出去、把收到的字節(jié)流還原成業(yè)務(wù)數(shù)據(jù)重連模塊則是一個(gè)狀態(tài)機(jī)監(jiān)控連接健康度并在異常時(shí)拉起重連。為什么這么分因?yàn)樗鼈兊纳芷诓灰粯?。TCP連接可能斷但握手邏輯是固定的幀處理是高頻調(diào)用的熱路徑要盡量輕量重連是低頻但關(guān)鍵的兜底邏輯要獨(dú)立出來避免和正常收發(fā)耦合。模塊化之后調(diào)試的時(shí)候能快速定位是哪一層出的問題——是連不上、握手失敗、還是幀解析錯(cuò)位一目了然。2.3 多線程驅(qū)動(dòng)模型的選擇易語言沒有事件驅(qū)動(dòng)的異步IOSocket的接收要么阻塞等要么非阻塞輪詢。我最終采用的是雙線程模型一個(gè)接收線程死循環(huán)調(diào)用recv讀數(shù)據(jù)讀到就丟進(jìn)緩沖區(qū)交給解析邏輯主線程負(fù)責(zé)業(yè)務(wù)處理和發(fā)送。發(fā)送本身在易語言里相對(duì)簡單因?yàn)閟end一般不會(huì)長時(shí)間阻塞除非發(fā)送緩沖區(qū)滿。為什么不搞單線程輪詢因?yàn)檩喸冮g隔不好定。間隔太短CPU空轉(zhuǎn)太長延遲高。而且輪詢模型下接收和業(yè)務(wù)處理擠在一個(gè)線程里一旦業(yè)務(wù)處理卡住接收就停了容易觸發(fā)服務(wù)端的心跳超時(shí)。雙線程把接收和業(yè)務(wù)解耦接收線程只管收收完往隊(duì)列一放業(yè)務(wù)線程慢慢處理互不干擾。注意易語言的多線程要小心共享變量。接收線程往緩沖區(qū)寫、業(yè)務(wù)線程從緩沖區(qū)讀必須加鎖或者用線程安全的隊(duì)列否則會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)亂甚至程序崩潰。我一開始圖省事直接共享一個(gè)字節(jié)集變量跑了兩天偶發(fā)崩潰查了很久才定位到是并發(fā)讀寫。3. 握手階段的協(xié)議細(xì)節(jié)與實(shí)現(xiàn)要點(diǎn)3.1 握手請(qǐng)求的拼裝邏輯WebSocket握手本質(zhì)是一次HTTP Upgrade請(qǐng)求??蛻舳税l(fā)一個(gè)帶特殊頭部的HTTP請(qǐng)求服務(wù)端如果同意升級(jí)返回101狀態(tài)碼之后這條連接就從HTTP協(xié)議切換到WebSocket協(xié)議。這個(gè)切換是協(xié)議層面的約定不是真的換了條連接還是原來那條TCP。請(qǐng)求行是GET /path HTTP/1.1關(guān)鍵是幾個(gè)頭部。Upgrade: websocket和Connection: Upgrade告訴服務(wù)端我要升級(jí)協(xié)議Sec-WebSocket-Key是一個(gè)Base64編碼的16字節(jié)隨機(jī)數(shù)服務(wù)端會(huì)拿它做一次固定算法的運(yùn)算再返回用來證明它真的懂WebSocket協(xié)議而不是隨便回了個(gè)101Sec-WebSocket-Version: 13聲明協(xié)議版本現(xiàn)在基本都用13。Sec-WebSocket-Key的生成有個(gè)細(xì)節(jié)必須是16字節(jié)隨機(jī)數(shù)再Base64。易語言里可以用取隨機(jī)數(shù)填充字節(jié)集但要注意隨機(jī)源的質(zhì)量。我見過有人直接用時(shí)間戳拼字符串當(dāng)key雖然大多數(shù)服務(wù)端不校驗(yàn)key的隨機(jī)性只校驗(yàn)運(yùn)算結(jié)果但規(guī)范要求隨機(jī)穩(wěn)妥起見還是老老實(shí)實(shí)生成16字節(jié)隨機(jī)數(shù)。生成完做Base64編碼拼進(jìn)請(qǐng)求頭。請(qǐng)求拼好后通過Socket發(fā)出去然后等響應(yīng)。這里有個(gè)坑響應(yīng)可能不是一次recv就能收全的。HTTP響應(yīng)頭可能分多個(gè)TCP包到達(dá)尤其是網(wǎng)絡(luò)狀況差的時(shí)候。所以接收邏輯要循環(huán)讀直到讀到\r\n\r\n這個(gè)頭部結(jié)束標(biāo)志才能認(rèn)為響應(yīng)頭收完了。我第一版就是假設(shè)一次recv能收全結(jié)果在弱網(wǎng)環(huán)境下偶發(fā)握手失敗后來改成循環(huán)讀才穩(wěn)定。3.2 響應(yīng)校驗(yàn)與101狀態(tài)碼處理收到響應(yīng)后要校驗(yàn)三件事。第一狀態(tài)行是不是HTTP/1.1 101 Switching Protocols101是協(xié)議切換成功的標(biāo)志其他狀態(tài)碼都算失敗。第二Upgrade頭是不是websocket。第三也是最容易被忽略的Sec-WebSocket-Accept的值對(duì)不對(duì)。Accept的計(jì)算方法是把客戶端發(fā)的Key和一個(gè)固定的GUID字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11拼接做SHA-1哈希再Base64編碼。服務(wù)端返回的Accept必須和這個(gè)算出來的值一致。為什么要校驗(yàn)因?yàn)橛行┲虚g層比如某些代理可能會(huì)錯(cuò)誤地返回101但實(shí)際沒升級(jí)成功校驗(yàn)Accept能確認(rèn)對(duì)面真的是個(gè)WebSocket服務(wù)端。雖然實(shí)際項(xiàng)目里很多客戶端偷懶不校驗(yàn)但我建議還是加上成本很低能擋掉一類詭異問題。易語言里做SHA-1和Base64都有現(xiàn)成命令拼接字符串后依次調(diào)用即可。算出來的值和響應(yīng)頭里的Accept做字符串比較注意大小寫和首尾空格響應(yīng)頭解析時(shí)要把值trim一下再比。3.3 握手階段的常見失敗原因握手失敗的原因五花八門我整理了幾類高頻的。第一類是請(qǐng)求頭拼錯(cuò)比如Upgrade寫成upgrade雖然HTTP頭不區(qū)分大小寫但有些簡陋的服務(wù)端實(shí)現(xiàn)會(huì)嚴(yán)格匹配或者Connection只寫了Upgrade沒寫keep-alive。第二類是路徑不對(duì)服務(wù)端可能要求特定的URL路徑路徑錯(cuò)了直接返回404。第三類是服務(wù)端不支持WebSocket返回普通HTTP響應(yīng)這時(shí)候要看狀態(tài)碼判斷。還有一類比較隱蔽握手成功但立即斷開。這種情況往往是服務(wù)端在握手后馬上做了鑒權(quán)發(fā)現(xiàn)token無效就關(guān)了連接。排查方法是抓包看握手響應(yīng)之后有沒有緊跟一個(gè)關(guān)閉幀有的話就是應(yīng)用層主動(dòng)斷的得去查鑒權(quán)邏輯。實(shí)操心得調(diào)試握手階段最有效的辦法是把發(fā)出去的請(qǐng)求原文和收到的響應(yīng)原文都打到日志里。易語言調(diào)試輸出有限我一般寫到一個(gè)文本文件里出問題時(shí)直接看原文比猜快得多。請(qǐng)求原文里Key是明文響應(yīng)原文里Accept是明文對(duì)照著一算就知道對(duì)不對(duì)。4. 數(shù)據(jù)幀的封裝、解析與心跳維持4.1 WebSocket幀結(jié)構(gòu)逐字段拆解握手完成后所有數(shù)據(jù)都以幀的形式傳輸。一個(gè)WebSocket幀的頭部最少2字節(jié)最多14字節(jié)后面跟負(fù)載數(shù)據(jù)。理解幀結(jié)構(gòu)是解析的核心我按字段順序講。第一個(gè)字節(jié)拆成兩部分最高位FIN標(biāo)志1位表示這是不是消息的最后一幀WebSocket允許一條消息拆成多幀發(fā)分片F(xiàn)IN1表示結(jié)束后面3位是保留位一般全0低4位是opcode操作碼決定這幀是什么類型。opcode常見值0x1文本幀、0x2二進(jìn)制幀、0x8關(guān)閉幀、0x9 ping、0xA pong。0x0是延續(xù)幀用于分片的后續(xù)部分。第二個(gè)字節(jié)最高位是MASK標(biāo)志表示負(fù)載是否用掩碼處理??蛻舳税l(fā)給服務(wù)端的幀必須掩碼服務(wù)端發(fā)給客戶端的幀必須不掩碼這是規(guī)范強(qiáng)制的。后面7位是負(fù)載長度。這里有個(gè)設(shè)計(jì)如果負(fù)載長度小于126這7位直接就是長度如果等于126后面跟2字節(jié)表示真實(shí)長度16位如果等于127后面跟8字節(jié)64位。這個(gè)變長設(shè)計(jì)是為了省頭部開銷小包只花2字節(jié)頭。如果MASK1掩碼標(biāo)志后面跟4字節(jié)掩碼key。然后是負(fù)載數(shù)據(jù)如果掩碼了負(fù)載每個(gè)字節(jié)要和掩碼key循環(huán)異或才能還原。掩碼的作用是防止某些中間緩存把WebSocket流量誤當(dāng)成HTTP緩存同時(shí)也增加了一點(diǎn)安全性。4.2 客戶端發(fā)送幀的封裝實(shí)現(xiàn)客戶端發(fā)幀重點(diǎn)是必須加掩碼。封裝流程先確定opcode發(fā)文本用0x1發(fā)二進(jìn)制用0x2算負(fù)載長度按長度區(qū)間決定長度字段占幾字節(jié)生成4字節(jié)隨機(jī)掩碼key把負(fù)載逐字節(jié)和掩碼key異或最后按第一字節(jié)第二字節(jié)擴(kuò)展長度掩碼key掩碼后負(fù)載的順序拼成完整幀發(fā)出去。長度計(jì)算這里容易出錯(cuò)。假設(shè)負(fù)載是200字節(jié)超過125但小于65536那第二字節(jié)的低7位要填126后面跟2字節(jié)的200。如果負(fù)載是70000字節(jié)超過65535低7位填127后面跟8字節(jié)。易語言里處理字節(jié)序要注意WebSocket規(guī)定多字節(jié)長度用大端序網(wǎng)絡(luò)字節(jié)序而易語言默認(rèn)的整數(shù)轉(zhuǎn)字節(jié)集可能是小端得手動(dòng)調(diào)換字節(jié)順序。我第一版就是忘了調(diào)字節(jié)序發(fā)小包正常一發(fā)大包服務(wù)端就報(bào)協(xié)議錯(cuò)誤查了半天才發(fā)現(xiàn)是長度字段字節(jié)序反了。掩碼異或的實(shí)現(xiàn)對(duì)負(fù)載字節(jié)集的每個(gè)字節(jié)取掩碼key對(duì)應(yīng)位置索引對(duì)4取模的字節(jié)做異或。易語言里用計(jì)次循環(huán)逐字節(jié)處理雖然效率不如批量操作但勝在直觀不易錯(cuò)。負(fù)載一般不大性能可以接受。4.3 接收幀的解析與粘包處理接收比發(fā)送麻煩因?yàn)門CP是流式的一次recv可能收到半個(gè)幀也可能收到一個(gè)半幀。所以解析不能假設(shè)一次recv就是一個(gè)完整幀必須維護(hù)一個(gè)接收緩沖區(qū)把收到的數(shù)據(jù)追加進(jìn)去然后循環(huán)嘗試從緩沖區(qū)頭部解析完整幀解析出一個(gè)就消費(fèi)掉對(duì)應(yīng)字節(jié)直到剩余數(shù)據(jù)不夠一個(gè)完整幀為止。這就是所謂的粘包/半包處理。解析步驟先看緩沖區(qū)夠不夠2字節(jié)不夠就等下次夠的話讀第一字節(jié)拿opcode和FIN讀第二字節(jié)拿MASK和長度根據(jù)長度字段判斷還需不需要讀擴(kuò)展長度再判斷需不需要讀掩碼key服務(wù)端發(fā)來的幀MASK0不需要最后算出負(fù)載長度檢查緩沖區(qū)剩余數(shù)據(jù)夠不夠負(fù)載不夠就等夠了就取出負(fù)載。如果MASK1還要做異或還原。這里有個(gè)易錯(cuò)點(diǎn)長度字段的讀取位置是動(dòng)態(tài)的。不能寫死偏移量必須根據(jù)前面的字段一步步往后推。我見過有人寫死負(fù)載從第6字節(jié)開始結(jié)果遇到不帶掩碼的服務(wù)端幀就全錯(cuò)位了。正確做法是維護(hù)一個(gè)游標(biāo)讀一個(gè)字段游標(biāo)往后移最后游標(biāo)位置就是負(fù)載起點(diǎn)。注意緩沖區(qū)消費(fèi)完已解析的幀后剩余數(shù)據(jù)要保留。易語言里操作字節(jié)集刪除頭部比較方便但頻繁刪除大字節(jié)集有性能開銷。如果數(shù)據(jù)量大可以用讀指針的方式記錄已消費(fèi)位置定期整理緩沖區(qū)避免每次都重建字節(jié)集。4.4 心跳機(jī)制的設(shè)計(jì)與參數(shù)選擇長連接最怕的是假死——TCP連接看起來還在實(shí)際上中間鏈路已經(jīng)斷了但雙方都沒察覺。WebSocket協(xié)議自帶ping/pong機(jī)制來解決這個(gè)問題一方發(fā)ping幀另一方必須回pong幀。如果發(fā)了ping在一定時(shí)間內(nèi)沒收到pong就判定連接失效主動(dòng)斷開重連。參數(shù)怎么定我實(shí)測(cè)下來心跳間隔30秒、超時(shí)判定90秒比較合適。間隔太短比如5秒會(huì)增加無謂流量尤其設(shè)備多的時(shí)候太長比如5分鐘則故障發(fā)現(xiàn)慢。90秒超時(shí)意味著連續(xù)3次心跳沒回應(yīng)才判定斷開能容忍偶發(fā)的網(wǎng)絡(luò)抖動(dòng)避免誤判。這個(gè)值可以根據(jù)實(shí)際網(wǎng)絡(luò)質(zhì)量調(diào)整弱網(wǎng)環(huán)境可以放寬到120秒。心跳由誰發(fā)起客戶端和服務(wù)端都可以但一般約定由客戶端定時(shí)發(fā)ping。我在接收線程里加了個(gè)計(jì)時(shí)器邏輯每30秒往發(fā)送隊(duì)列塞一個(gè)ping幀。收到pong幀時(shí)更新最后活躍時(shí)間。另一個(gè)線程定期檢查當(dāng)前時(shí)間減最后活躍時(shí)間超過90秒就觸發(fā)重連。這樣即使沒有業(yè)務(wù)數(shù)據(jù)連接的健康狀態(tài)也能被持續(xù)監(jiān)控。有個(gè)細(xì)節(jié)ping幀的負(fù)載可以帶數(shù)據(jù)最多125字節(jié)pong幀要原樣帶回。我一般不帶負(fù)載簡單。但要注意收到ping幀時(shí)必須回pong這是規(guī)范要求不回的話對(duì)端可能判定你失效。服務(wù)端發(fā)來的ping也要處理別只顧著自己發(fā)。5. 斷線重連的狀態(tài)機(jī)與消息補(bǔ)償5.1 連接狀態(tài)的劃分與轉(zhuǎn)換斷線重連是整個(gè)源碼里邏輯最繞的部分核心是搞清楚當(dāng)前處于什么狀態(tài)。我把連接狀態(tài)分成五個(gè)未連接、連接中、已握手、已斷開、重連等待。狀態(tài)之間的轉(zhuǎn)換由事件驅(qū)動(dòng)發(fā)起連接→連接中TCP連上且握手成功→已握手檢測(cè)到斷開或主動(dòng)關(guān)閉→已斷開進(jìn)入重連流程→重連等待等待結(jié)束→連接中循環(huán)。為什么要分這么細(xì)因?yàn)椴煌瑺顟B(tài)下能做的事不一樣。比如連接中的時(shí)候不能發(fā)業(yè)務(wù)數(shù)據(jù)得排隊(duì)已握手才能正常收發(fā)重連等待期間要決定是繼續(xù)等還是放棄。狀態(tài)清晰了代碼里的分支判斷才不會(huì)亂。我第一版沒分狀態(tài)用一個(gè)布爾變量表示是否連接結(jié)果重連過程中各種邊界情況處理得一團(tuán)糟后來重構(gòu)成狀態(tài)機(jī)才理順。狀態(tài)變量要用全局的但讀寫要加鎖因?yàn)榻邮站€程、發(fā)送線程、重連線程都可能碰它。易語言里可以用臨界區(qū)或者簡單的標(biāo)志位配合原子操作穩(wěn)妥起見我用臨界區(qū)保護(hù)狀態(tài)讀寫。5.2 指數(shù)退避重連策略重連不能傻乎乎地一直高頻重試那樣服務(wù)端掛了的時(shí)候會(huì)把人家打垮自己也被防火墻拉黑。標(biāo)準(zhǔn)做法是指數(shù)退避第一次斷開后等1秒重連失敗等2秒再失敗等4秒以此類推直到一個(gè)上限比如30秒之后一直按上限間隔重試。為什么用指數(shù)而不是固定間隔因?yàn)閿嗑€原因可能是服務(wù)端重啟很快恢復(fù)短間隔能快速重連上也可能是網(wǎng)絡(luò)故障恢復(fù)慢長間隔避免無效重試。指數(shù)退避兼顧了兩種情況初期快速試探后期降低頻率。上限30秒是經(jīng)驗(yàn)值太長了恢復(fù)慢太短了壓力大。還有個(gè)優(yōu)化重連成功后退避計(jì)數(shù)要清零。否則連接穩(wěn)定運(yùn)行一段時(shí)間后又?jǐn)鄷?huì)直接從上次的高間隔開始等不合理。我一般在握手成功后把重試計(jì)數(shù)重置為0。5.3 重連期間的消息緩存與補(bǔ)償斷線期間業(yè)務(wù)層可能還在產(chǎn)生要發(fā)的消息這些消息不能丟。我的做法是維護(hù)一個(gè)發(fā)送隊(duì)列正常連接時(shí)消息直接發(fā)斷線時(shí)消息進(jìn)隊(duì)列暫存重連成功后把隊(duì)列里的消息按順序補(bǔ)發(fā)出去。隊(duì)列要有上限不然斷線久了內(nèi)存撐爆。我設(shè)的是1000條超了就丟最老的或者按業(yè)務(wù)重要性丟棄。補(bǔ)發(fā)的時(shí)候要注意順序WebSocket本身保證幀的順序但補(bǔ)發(fā)是應(yīng)用層行為得自己保證先入先出。接收方向也有補(bǔ)償問題。斷線期間服務(wù)端推的消息客戶端收不到重連后服務(wù)端會(huì)不會(huì)重發(fā)這取決于業(yè)務(wù)協(xié)議。我的做法是重連成功后客戶端主動(dòng)發(fā)一個(gè)同步請(qǐng)求讓服務(wù)端把斷線期間的狀態(tài)快照推過來這樣就不依賴服務(wù)端的消息重發(fā)機(jī)制更可靠。實(shí)操心得重連邏輯最容易出的bug是重連風(fēng)暴——多個(gè)線程同時(shí)檢測(cè)到斷線各自發(fā)起重連結(jié)果建了一堆連接。解決辦法是重連動(dòng)作只由一個(gè)線程負(fù)責(zé)其他線程只負(fù)責(zé)把狀態(tài)置為已斷開重連線程看到狀態(tài)變化才行動(dòng)。加個(gè)重連中標(biāo)志位防止重復(fù)發(fā)起。6. 實(shí)操過程與關(guān)鍵環(huán)節(jié)落地6.1 環(huán)境準(zhǔn)備與Socket組件初始化動(dòng)手之前先把環(huán)境理清楚。易語言版本建議用較新的老版本對(duì)多線程和字節(jié)集操作的支持有差異。Socket組件用系統(tǒng)自帶的或者第三方穩(wěn)定組件都行核心是要支持非阻塞或者能配合線程使用。我用的是一個(gè)支持設(shè)置超時(shí)的TCP客戶端組件超時(shí)設(shè)置很關(guān)鍵——連接超時(shí)設(shè)5秒接收超時(shí)設(shè)短一點(diǎn)比如1秒這樣接收線程能定期醒來檢查狀態(tài)不會(huì)永久阻塞。初始化流程創(chuàng)建Socket對(duì)象→設(shè)置服務(wù)器地址和端口→設(shè)置各項(xiàng)超時(shí)→發(fā)起連接。連接是異步的發(fā)起后要輪詢或者等回調(diào)確認(rèn)連上了。連上之后立即進(jìn)入握手流程拼請(qǐng)求、發(fā)送、等響應(yīng)、校驗(yàn)。這一整套封裝成一個(gè)建立連接的函數(shù)返回成功或失敗。參數(shù)上服務(wù)器地址和端口建議做成配置項(xiàng)方便切換環(huán)境。超時(shí)值我前面說了連接5秒、接收1秒發(fā)送超時(shí)設(shè)3秒。這些值不是死的網(wǎng)絡(luò)差的環(huán)境適當(dāng)放大。6.2 接收線程的循環(huán)結(jié)構(gòu)與退出條件接收線程是整個(gè)客戶端的發(fā)動(dòng)機(jī)結(jié)構(gòu)要寫扎實(shí)?;竟羌苁茄h(huán)判斷 是否退出 → 否 → 調(diào)用recv讀數(shù)據(jù) → 讀到數(shù)據(jù)追加到緩沖區(qū) → 調(diào)用解析函數(shù)處理緩沖區(qū) → 處理解析出的幀 → 繼續(xù)循環(huán)。recv返回0或者報(bào)錯(cuò)說明連接斷了置狀態(tài)為已斷開退出循環(huán)。退出條件要設(shè)計(jì)好。不能只靠recv報(bào)錯(cuò)因?yàn)橛行┣闆r下recv會(huì)一直阻塞。所以recv要設(shè)超時(shí)超時(shí)返回后檢查一個(gè)退出標(biāo)志標(biāo)志為真就跳出循環(huán)。這個(gè)標(biāo)志由主線程在關(guān)閉連接時(shí)設(shè)置。線程退出前要清理資源關(guān)閉Socket。解析函數(shù)是熱路徑要寫得高效。我前面說的游標(biāo)法解析每次從緩沖區(qū)頭開始嘗試解析解析出一個(gè)幀就消費(fèi)掉循環(huán)直到解析不出完整幀。解析出的幀按opcode分發(fā)文本幀和二進(jìn)制幀交給業(yè)務(wù)回調(diào)ping幀回pongpong幀更新活躍時(shí)間關(guān)閉幀觸發(fā)斷開流程。6.3 發(fā)送隊(duì)列與線程安全實(shí)現(xiàn)發(fā)送這塊我用了一個(gè)隊(duì)列加一個(gè)發(fā)送線程。業(yè)務(wù)層調(diào)發(fā)送消息接口時(shí)把消息封裝成幀塞進(jìn)隊(duì)列發(fā)送線程從隊(duì)列取幀往Socket寫。為什么要單獨(dú)一個(gè)發(fā)送線程因?yàn)閟end在某些情況下也會(huì)阻塞發(fā)送緩沖區(qū)滿如果在業(yè)務(wù)線程里直接send會(huì)卡住業(yè)務(wù)。獨(dú)立發(fā)送線程能隔離這個(gè)風(fēng)險(xiǎn)。隊(duì)列的線程安全是重點(diǎn)。業(yè)務(wù)線程寫隊(duì)列、發(fā)送線程讀隊(duì)列必須加鎖。易語言里用臨界區(qū)進(jìn)隊(duì)列和出隊(duì)列都包在臨界區(qū)里。隊(duì)列用數(shù)組或者鏈表實(shí)現(xiàn)都行我用的是循環(huán)數(shù)組固定大小滿了就阻塞或者丟棄看業(yè)務(wù)需求。發(fā)送線程的邏輯循環(huán) → 隊(duì)列空則等待用延時(shí)或事件→ 非空則取出幀 → send → 檢查send結(jié)果 → 失敗則觸發(fā)重連。send失敗通常意味著連接已斷這時(shí)候要把狀態(tài)置為已斷開讓重連線程接手。6.4 完整重連流程的串聯(lián)把前面幾塊串起來重連的完整流程是這樣的接收線程或發(fā)送線程檢測(cè)到連接異?!脿顟B(tài)為已斷開→重連線程獨(dú)立線程檢測(cè)到狀態(tài)變化→進(jìn)入重連等待→按指數(shù)退避計(jì)算等待時(shí)間→等待結(jié)束→置狀態(tài)為連接中→調(diào)用建立連接函數(shù)→成功則置已握手、清零退避計(jì)數(shù)、補(bǔ)發(fā)隊(duì)列消息、發(fā)同步請(qǐng)求失敗則退避計(jì)數(shù)加一回到重連等待。這個(gè)流程里重連線程是唯一的決策者其他線程只負(fù)責(zé)報(bào)告異常。這樣避免了多線程搶著重連的問題。重連線程本身也是個(gè)循環(huán)定期檢查狀態(tài)狀態(tài)是已斷開就推進(jìn)重連流程。補(bǔ)發(fā)消息和同步請(qǐng)求要在握手成功之后、正式對(duì)外聲明已連接之前完成這樣業(yè)務(wù)層感知到的連接狀態(tài)是干凈的——要么沒連上要么連上了且數(shù)據(jù)已同步。7. 常見問題與排查技巧實(shí)錄7.1 握手成功但收不到數(shù)據(jù)這個(gè)現(xiàn)象很迷惑握手返回101Accept校驗(yàn)也過了但之后就是收不到任何業(yè)務(wù)數(shù)據(jù)。排查下來常見原因有兩個(gè)。一是服務(wù)端在等客戶端先發(fā)數(shù)據(jù)有些服務(wù)端實(shí)現(xiàn)要求客戶端握手后立即發(fā)一個(gè)訂閱或認(rèn)證消息不發(fā)就不推數(shù)據(jù)。解決辦法是看服務(wù)端文檔握手后主動(dòng)發(fā)一條初始化消息。二是幀解析錯(cuò)位收到的數(shù)據(jù)其實(shí)在緩沖區(qū)里但解析邏輯因?yàn)槟硞€(gè)字段讀錯(cuò)導(dǎo)致一直認(rèn)為數(shù)據(jù)不完整。排查方法是把緩沖區(qū)原始字節(jié)打印出來手動(dòng)按幀結(jié)構(gòu)對(duì)一遍看解析游標(biāo)是不是卡在某個(gè)位置。7.2 大消息發(fā)送導(dǎo)致連接斷開發(fā)小消息正常一發(fā)大消息比如超過64KB連接就斷。這多半是長度字段字節(jié)序問題。前面說過WebSocket長度用大端序易語言整數(shù)轉(zhuǎn)字節(jié)集默認(rèn)可能是小端。負(fù)載超過125字節(jié)時(shí)長度字段開始用擴(kuò)展字節(jié)超過65535時(shí)用8字節(jié)這兩個(gè)地方如果字節(jié)序反了服務(wù)端解析出的長度會(huì)是個(gè)天文數(shù)字直接判定協(xié)議錯(cuò)誤斷開連接。解決辦法是顯式做字節(jié)序轉(zhuǎn)換把整數(shù)的字節(jié)順序調(diào)過來再拼進(jìn)幀頭。7.3 重連后消息重復(fù)或丟失重連補(bǔ)償邏輯沒寫對(duì)會(huì)出現(xiàn)重復(fù)或丟失。重復(fù)的原因通常是補(bǔ)發(fā)隊(duì)列沒清空重連成功后把已經(jīng)發(fā)過的消息又發(fā)了一遍。丟失的原因可能是斷線瞬間正在發(fā)送的消息既沒發(fā)成功也沒進(jìn)隊(duì)列。解決辦法是發(fā)送確認(rèn)機(jī)制消息進(jìn)隊(duì)列時(shí)標(biāo)記待發(fā)發(fā)送成功后標(biāo)記已發(fā)補(bǔ)發(fā)時(shí)只發(fā)待發(fā)的。斷線瞬間的消息在send失敗時(shí)重新入隊(duì)。7.4 常見問題速查表現(xiàn)象可能原因排查方向解決思路握手返回非101路徑錯(cuò)、服務(wù)端不支持、請(qǐng)求頭拼錯(cuò)打印請(qǐng)求和響應(yīng)原文對(duì)照規(guī)范逐頭檢查握手101但Accept校驗(yàn)失敗服務(wù)端實(shí)現(xiàn)不規(guī)范或中間層干擾手動(dòng)算Accept對(duì)比確認(rèn)服務(wù)端真實(shí)支持WebSocket收不到數(shù)據(jù)服務(wù)端等初始化消息、解析錯(cuò)位打印緩沖區(qū)原始字節(jié)補(bǔ)發(fā)初始化消息、修正解析游標(biāo)大消息斷開長度字段字節(jié)序錯(cuò)檢查擴(kuò)展長度字節(jié)順序顯式轉(zhuǎn)大端序頻繁誤判斷線心跳超時(shí)太短看斷線時(shí)間間隔放寬超時(shí)到90秒以上重連風(fēng)暴多線程重復(fù)發(fā)起重連看日志重連次數(shù)重連動(dòng)作單線程化消息重復(fù)補(bǔ)發(fā)隊(duì)列未清看補(bǔ)發(fā)日志發(fā)送確認(rèn)隊(duì)列清理消息丟失斷線瞬間消息未入隊(duì)看發(fā)送失敗處理send失敗重新入隊(duì)7.5 幾個(gè)不寫在文檔里的避坑經(jīng)驗(yàn)第一個(gè)經(jīng)驗(yàn)日志要帶時(shí)間戳和線程標(biāo)識(shí)。多線程環(huán)境下沒有線程標(biāo)識(shí)的日志根本沒法分析時(shí)序你不知道哪條日志是接收線程打的、哪條是重連線程打的。時(shí)間戳精確到毫秒能看出事件先后。第二個(gè)經(jīng)驗(yàn)緩沖區(qū)大小要設(shè)合理。接收緩沖區(qū)太小會(huì)頻繁觸發(fā)擴(kuò)容太大浪費(fèi)內(nèi)存。我一般初始設(shè)8KB按需增長上限設(shè)1MB超過說明有問題可能是解析卡住了導(dǎo)致數(shù)據(jù)堆積。第三個(gè)經(jīng)驗(yàn)測(cè)試要模擬弱網(wǎng)和斷網(wǎng)。正常網(wǎng)絡(luò)下跑通不代表穩(wěn)定我專門寫了個(gè)測(cè)試工具能模擬延遲、丟包、隨機(jī)斷開跑一晚上看重連邏輯扛不扛得住。很多重連的邊界bug都是這么測(cè)出來的。第四個(gè)經(jīng)驗(yàn)關(guān)閉連接要優(yōu)雅。主動(dòng)關(guān)閉時(shí)先發(fā)關(guān)閉幀opcode 0x8等對(duì)方回關(guān)閉幀或者超時(shí)再關(guān)TCP。直接關(guān)TCP可能導(dǎo)致對(duì)方收到RST日志里一堆錯(cuò)誤。雖然不影響功能但優(yōu)雅關(guān)閉能讓日志干凈很多排查問題時(shí)少干擾。這套源碼我前后迭代了三四版從最初只能跑通握手到后來能扛住整晚的弱網(wǎng)測(cè)試中間踩的坑基本都寫在上面的排查表里了。WebSocket協(xié)議本身不復(fù)雜復(fù)雜的是工程上的健壯性——連接會(huì)斷、網(wǎng)絡(luò)會(huì)抖、消息會(huì)亂序把這些邊界情況都想到并處理好才算真正能用。易語言雖然在這方面生態(tài)弱一些但協(xié)議是死的照著規(guī)范一步步實(shí)現(xiàn)配合清晰的狀態(tài)管理和充分的測(cè)試做出來的東西一樣穩(wěn)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷久久久精品| 亚洲国产成人精品999| 亚洲骚逼少妇| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 欧洲精品区| 美女被艹尤物视频| 2017大香蕉| 人妻久久久久久| 熟女久久久| 国产精品久久99日日| 欧美熟女少妇| 久久网亚洲| 久久成人午夜狠狠| 婷婷性爱| 91亚洲网| 亚洲第一页欧美| 九九九九免费高| 67914在线兔费成人视频| 亚洲国产综合视频| 国产区性爱在线视频秋霞豆| 一起草AV| 中文一区在线日| 久久久久久久久999| 亚洲性爱电影| 亚洲有薄码区日本系列中文字幕| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚 | 操我啊啊啊啊啊| 国产精品九九| 亚洲精品国语在线播放| 日韩av不卡在线观看| 精品久久久久9999| 老熟女天天操| 久久国内| 青娱乐大香蕉| 日韩精品在线视频,日韩精品……| 免费看国产曰批40分钟怎么下载| 96AV精品| 少妇激情一区二区三区视频| 性开放中文AV高清无码免费看| 麻豆天美国美国产| 亚洲精品97p| 99久久婷婷丁香| 91偷拍欧美亚洲| 久久久艹艹艹| 色欧洲97| 麻豆成人av| 老熟女区| yiren97| 无码高清国产AV| 人妻内射一区二区在线视频| 99热这里只有精品9| 国产AV线| 手机看片1024你懂的国产| 韩日精品四区| 亚洲一本色码中文字幕| 另类一区| 99国产在线绯色一区| 懂色aV一区二区天美传媒| 91久久久久久| 大香蕉视频啪啪啪啪| 日本黄 R色 成 人网站| 久久久三区二区一区| 国产无码一二三区| oumeizonghese,www| gogogo免费高清看中国国语 | 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 91天美传媒精品| 日韩免费a级毛片无码a∨| 久久性爱视频| 狠狠色五月亚洲91| 色综合久久88色综合久久天天| 97亚洲国产| 婷婷亚洲五月***久久| 国产又长又大又粗的视频| 国产18精品亚洲精品| 丁香7月婷婷| 欧美精品自慰系列寂寞少妇 | 色九九综合| 91网站18| 蜜乳Av成人片网站| 日韩国产成人自拍视频| 欧美狠狠操| 品亲网欧美品亲网| 欧美日韩另类激情图片| 亚洲人天堂| 大香蕉综合久久| 色噜噜婷婷| 91在线精品一区二区三区| 国产精品一区在线播放| 久久久久国产亚洲一区欧美色图日韩| 国产精品人妻无码久久久老鸭窝| 欧洲亚洲人人爽爽视频| 久久久亚洲熟妇资源| 天天干一干| 无码区蜜乳| 51一区二区三区| 欧美色图亚洲色图成人在在线| 久久这里是精品| 日本亚洲嫩草影院啪啪| 亚洲淫乱骚妇AV| 亚洲超碰在线| 亚洲高清无毛一区二区| 亚洲猛交| 亚洲大胆人体av| 五月天色五月| 91在线精品| 日韩97P| 欧美亚州色的图| 天天舔天天 | 久久AV无码网址| 9久精品| 精品久操| 日韩9999| 国产suv精品一区二区四区999 | 日韩中文字幕av在线播放| 欧美日韩99| 男人女人18禁片免费看网站| 欧美另类丝袜熟女| 91五月天| 操逼内射干逼白丝91| 嗯啊不要在线| 久久五十路熟女人妻| 约操熟妇| 欧美在线l亚洲| 国产精品精品系列在线观看| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | gogogo免费高清看中国国语 | 天天干天天干天天干| 激情五月天色色| 成人性爱全视频观看| 日韩在线电影| 四虎免费在线播放| 九九九九精| 国产十八禁视频| 免费人成毛片乱码| 茄子社区国产精品| 另类图片五月| 亚洲高清无码免费观看视频| 亚洲国产精品成人综合| 天天操福利视频综合网站| 亚洲精品819| 亚洲欧洲精品视频发布| 国产精品九九九| 操淫穴亚洲五月丁香 | 亚洲成a人片在线观看中文!!!| 亚洲色图第四色| 久久色情| 性爱乱伦视频免费| 偷拍偷窥与盗摄视频专区| 2020中文字幕在线| 67194无码不卡| 青青久久手机线视频| 综合第一页| 人人九九精| 天综合网欧美| 亚洲色91C| 欧洲色色| 啪一啪免费视频| 成人精品久久久午夜福利| 天久久久噜噜噜久久国产精品爽爽 | 人人摸人人添人人操 | 婷婷五月天影院| 无码乱人伦中文视频| 国产黄片在线免费观看| 欧美精品日韩久久久九| 人妻丰满熟妇一区二区三| 嗯嗯啊啊操我| 诱惑网综合| 热G综合热G中文| 嗯嗯啊啊用力视频免费| 日韩熟女精品无码专区一区二区| 亚洲无码99| 加勒比久久综合网高清| 97超碰色色| 嗯嗯啊啊亚欧精品| av九九| 亚洲.欧美.丝袜.中文.综合| 超碰日本97美女人妻人人玩人人爱| 欧美精品自慰系列寂寞少妇| 久久无码电影| 午夜理论片在线观看免费| 人人摸.人人色| 国产女同视频在线播放| 亚洲一区二区在线观看91| 亚洲欧美色图小说| 老熟女乱伦片| 奇米狠999| 国产自偷自拍一区| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 91深夜夜| 日韩欧美国产一区二区三区四区 | a片亚洲一本通视频| 玖玖97综合 | 97超碰磁| 人人摸人人添人人操| 夜夜操美女| 日韩99999| 日韩AV噜噜噜一区二区三区四区| 亚洲天堂男人天堂| 国产操偷| 人妻在线臀日韩| 东京热大香焦| 超碰在线人人射| 成人激情无码在线视频| 一区二区三区精品久久| 久久精品免费| 中文字幕欧美日本乱码一线二线 | 国产极品美女高潮无套在线观看| 天天爽天天操| AV色图| 白丝AV| 国产AV激情无码久久无码| 色婷五月天| 欧美亚洲宗合色性图| 丰满人妻一区二区三区四区| 中文字幕123| 96AV精品| 天天欧美| 亚洲经典啪啪| 国产白丝在线| 日韩中文字墓| 91丨九色丨东北熟女| 国产av热热色| 黄片www视频免费| 99视频内射三四| 青青伊人加勒比海| 色色毛片| 超碰亚洲欧美日韩无| 亚殴在线| 啊啊啊好想要| 精品国产污一区二区三区| 国产sv美女内射| 欧美特大黄一级片片免费| 丝袜色综合| 日本一区二区不卡精品| 欧美在线第五页| 操逼逼无码| 国产夫妻性生活视频| 日本综合久久| 偷拍盗拍亚洲色图图片| 国产原创自拍| 99re免费视频精品全部| 日韩三级在线观看mp4| 亚川综合视频| 欧美九一精品久久久熟妇| 丰满人妻av一区二区三区| 九九九九九九综合| www.色五月| 久操视频在线观看| 久久中出在线| 国内自拍 日韩激情 99| 蜜区区视频79 | 亚洲综合码| 中文字幕一二区二三区人妻专区| 午夜福利在线合集| 国产激情视频在线观看| 性天堂| 91成人社区| 天天干天天插| 狠狠色噜噜狠狠狠狠2018| 国产精品不卡一区二区三区| 亚洲五月婷| 亚洲不卡av在线| 风月影院男女十八禁| 日韩欧美中文字亚洲慕| 98超碰欧美| 老女人综合网| 口爆吞精在线观看| 成年人黄色小视频网站| 日韩AV无码网站| 99精品在线| 爱爱动态试试看6 0秒| 国产精品视频精品一二| 91香蕉视频在线观看免费| 嗯嗯啊啊好疼| 日韩一级二级| 欧洲亚洲人妻无码中字久久三区四区| 一本色道久久综合亚洲二区三区| 超碰精品| 亚洲无码99| 日韩图色| 91麻豆天美国产欧美日| 精品乱码在线观看| 丰满人妻一区二区三区四区| 秋霞午夜视频一区二区| 96超碰网| 成人A片男人的天堂| 久久免费99精品久久久久久| 天天天天天超碰| 婷婷av在线中文字幕| 天天干,夜夜爽| 超碰4A| 91少妇高潮| 午夜福利精品| 欧美色吧综合| 91在线限制级| 97日韩欧美亚洲| 精品人妻二区三区| 日韩av乱伦| 强奸乱伦中文字幕AV| 欧美性生活男人的天堂| 色噜噜国产精品视频一区二区| 国产欧洲精品亚洲午夜拍精品| 97视频7| 久久久 国产精品| 日韩精品免费高清视频在线| 欧洲综合无码| 国产91会所女技师在线观看| 亚洲综合欧美| 污色区网站| 搡老女人老91妇女老熟女| 亚洲色阁| 一区在线精品中文字幕| 少妇久久久久久| 亚洲另类天堂| 91精片| 人人么人人操| 麻豆视频国产一区二区| 天天操人人操狠狠插| 最新日日夜夜天天干干| 欧美性爱无码一区二区三区| 最新亚洲人成网站在线影院| 久久久久亚洲av综合波多野制衣| 日韩国产欧美伦理在线| 欧美黑人精品一区二区| 亚洲日韩美女中文字幕乱| 日韩精品中文字幕一| 入口操逼网站| 五月丁香色色网| 深爱激情五月天| 在现视频女上位好爽| 天天综合网在线| 欧美大干日韩| 天天摸,夜夜摸| 91色伦| 久久9视频| 九九九九亚洲| 99青青草国产视频| 国产精品色片一区二区| 97看操| 翔田千里AV无码秘 三区| 殴美在线AⅤ| 九九热超碰97亚洲最新香蕉| 日韩欧无码一区二区三区免费不卡| caorenqi shipin| 天天综合香 ld视频| 国产视频小说| 国产99999久久精品| 欧美人妻久久精品二区三区| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 久 久无码人妻AV| 一区| 亚洲精品国产av天美传媒| 91黑丝操| 啊啊啊在线观看| 亚洲日韩av专区无码| 岛国在线免费视频| 影音先锋乱| 激情五月婷婷| 东北老女人的激情视频| 人妻美腿丝袜日韩| 91亚洲图片| 日韩黄片影院| 久久天堂网| 欧美综合综合| 18啪啪手机免费性爱| 可以在线观看AV的网站| 蜜桃成人1区2区3区| 97人人爱人人做人人乐| 易易A毛视频| 在线岛| 啊v视频在线观看| 江都AV在线| 国产乱子伦一区二区三区免看| 91美| 夜夜影视四色| 射丝袜高跟鞋99| 啊啊啊啊,啊啊好多水| 国产精品 视频| 国产一级做a爰大片免费久久| 欧美v日韩欧亚洲电影天堂色诱,国产传媒 | 久久精品72| 亚洲高潮影院| 欧美国产欧美在线观看| 国产超碰国产97| 男人的天堂无码| 18禁在线视频| 亚洲色图激情小说| 天堂av最新电影网| 国产精品熟女九色九色蜜臀| 96久久科窝| 97色诱| 欧美v日韩v亚洲v最新在线| 国产乱伦性爱AV| 做爱福利视频一区二区| 黑人娇小av在线播放| 亚洲图片偷拍视频区| 欧美综合网1| 9色国产精品一区粉嫩| 丁香五月偷拍| 哈哈操 大香蕉| 大香蕉线| 婷婷久久大香蕉| 欧美韩日精品99综合| 色成人Www精品永久观看| 99www.bibizy香蕉资源国产一区二区三区高清 | 国产精品网址| 97色色色| 99精品人人爽| 亚洲图片激情综合另类| 熟妇高潮一区二| 久久 国产 无码| 欧美色图天堂网m| 91N综合网| 一区二区娱乐网站| 一卡二卡在线播放| 国产乱伦一二三区| 国产精品一二三| 香蕉热人人精品| 天天天乱色综合全| 女人被男人桶爽视频网站| 免费看污网址| 日韩卡一卡二卡三在线| 一区二区三区男女操逼黄色小电影| av影片在线观看不卡| 久久不卡一区二区| 精品丝袜无码一区二区三APP| 欧美少妇性乱| 1024人妻熟女一区二区三区| 天天干夜夜操一区二区| www久久久| 公司1区2区3区精产精| 久热9| www欧美91| 青青青操| 天天干天天燥| 中文字幕熟女人妻丝袜丝| 日本道久久综合色色| 俺去啦自拍| 日韩无码专区| 91综合色噜噜| 久久久久密臀视频| 91精品久久久久五月天精品| 亚州黄站| 久超超碰| 亚洲 日本 一 二 三| 欧美一区二区三区不卡高清视频| 330Dv国产女人终合视频极品人与兽| 老熟妇一区二区三区…| 天天综合-91入口| 国产久久久久影院老熟女| 成人免费福利在线观看| 欧美组图日韩亚洲中文字幕| 欧美手机在线综合| 91电影色诱| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 青青草无码视频| AV天天在线观看| 国产伦乱91| 97在线观看播放视频| 精品午夜福利| 91精品久久久久久| 日本青青草在线| 五月婷婷大香蕉| 婷婷中文网| 乳欲人妻办公室奶水| 女人精品内射国产99| 国产国产亚洲一二三久久| 99精品久久久久久| 欧美色66| 美女久久久久久久| 精品久久一区二区三区四区五区| 97色在线视频| 天天综合网1| 久操网无码在线| 天天草天天日| 亚洲男人天堂手机版| 亚洲性猛交| 精品一区二区三区蜜桃臀赵总 | 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 搡老女人老91妇女熟女| av天堂天堂av日韩| 久热无码| 国产精品久久| 男人天堂无码| 色婷婷视频| 97爱| 96麻豆精品一区二区三区| 熟妇人妻一区二区三在线 | 97欧美日韩中文| 艳美熟妇先锋一二三区| 激情五月天色色| 日韩探花精品在线视频| 欧美午夜视频免费观看| 久久夜夜| 美女黄网| 色网色网色网色网色网色| 91精品久久久久久| 久操影视| 亚洲诱惑天堂| 美女丝袜激情小说| 欧美综合 站| baiduhicn.com。| 乱老熟女一区二区三区| 国产精品第二页| 麻豆性爱视频在线播放| 欧美97日韩精品| 97视频620| 天天日天天舔东京热 | 中文字幕 人妻不满 在线视频| 天天干天天操天天干天天操| 97欧美性爱| 精品国产一区二区三区香蕉欧美| 成年人黄色视频免费| 少妇高潮九九九九| 久操电影网| 91性感网站| 91成人在线| 极品内射| 女生自91网站| 啊啊啊久久久视频| 亚洲春色欧美| 久久久久九九九| 91制服丝袜中文字幕| 日韩兔费看黄片| 91深夜夜| 男人兔费天堂| 免费看污网址| 久草在线| 家庭乱伦性爱av| 婷婷啪啪| 你草精品在线视频| 伦理弟一页| 日韩电影中文字幕| 大香蕉中文| 无码国产Av| 亚洲久热| 超碰97首页| 校园春色亚洲色图| 欧美精品一区二区少妇免费A片| 亚洲国产麻豆一区二区三区| 97超碰国产亚洲精品资源| 神马久久啊啊| 屁股久久久久久| 婷婷五月天AV| 欧美日韩精品久久| 国产麻豆91欧美一区二区久久婷婷国产精品| …亚洲黄色厕厕女女在线播…| 国产亚洲中文不卡二区| 日本ZZ高免费A级视频| 亚洲欧美色图片| 簧片免费看视频| 一区二区视频你懂的| 91精品国产91久久青草 | 欧美一区二区情色| 97国产精品久久久久| 久久久久久九九九九九| 亚洲一区中文精品| 亚洲最大无码中文字幕网站| 中亚黄色三级大片| 亚洲欧美日韩免费电影| 野狼激情网| 天天影视综合色| 成人精品一区二区91毛片不卡| 九九黄色网| 伊人在线大香蕉二。| 欧美gv在线观看| 亚州少妇| 啊啊啊啊啊好多水| julia高潮后不停追击中出| 校园春色宗合网| 无码高清操逼网址| 国产SV一线| 久草午夜| 久热伊人99re| 色香欲综合| 一区二区激情国产熟女 | 日本亚洲vr欧美不卡高清专区| 精品国产乱码久久久久久久久久毛片| 无码精品一区二区三区潘金莲| 色女综合| 久久久精品中文字幕爱豆| 九九热精品在线| 天天综合网网欲色| www.操| 秋霞午夜成人福利片片| 久久久久久久久久久久久9999| 欲香欲色| 欧美色66| 女人被男人桶爽视频网站| 国产白领连续中出在线播放| 操逼不卡中文字幕| 久久亚洲一区二区色婷婷| 91一起操| 欧美精品精品一区二区| 超碰在线97国产| 韩国一级AAA| 色色97爱| 国产欧美日韩臀| 久久香蕉影院| 操婢日韩| 中文字幕第7页| 青娱乐亚洲热| 欧美日韩日产免费网站看| 久超碰这里只有精品| 伊人黄色视频免费观看| 亚洲情色 无码专区| 美欧老女人97| 色情综合网| 7777奇米影视久久| 超碰色97| 天天看高清麻豆| 岛园激情| 亚洲精品一区二区精华| 伊人在线大香蕉二。| 99热99re超碰精品| 女人双腿搬开让男人桶| 思思热国产高清| 男人天堂久久精品不卡| 99自拍B亚洲| 日韩黄色成人性爱| 超碰日韩人妻| 粉嫩av一区二区三区天美传媒 | 深夜激情| 欧美韩国你懂得在线| 大香樵伊人网| 国产成人免费观看在线视频| 天天日天天操天天射河南省| 国产精品夜夜夜| 大香蕉欧美国产日韩高潮| 天天爽天天| 另类一区| 国产www色在线观看| 成人五月天丁香激情综合| 97伦综合| 日韩二区三四区五区六区在线看| 国产亚卅97| 成人夜夜爽| 国产欧美亚洲精品a第2页| 国产女同视频在线播放| 天天上日日上日韩精品| 午夜精品久久久久久久第一页按摩| 欧美精品三区| 成人黄页| 亚洲Av噜噜一区二区三区妖精| 亚州操操穴网| 午夜AV污污污| 丁香五月天堂网| 精品美女少妇一区二区| 俞拍自拍| 玖玖大干人妻| 日韩三级av片| 亚洲欧美另类图片| 日韩在线观看三级电影| 91肉丝| 伊人网免费视频| 久久久亚洲Av| 亚洲情色中文字幕一区| 免费一级毛片在线视频观看| 婷婷操逼| 东北女人av| 97日视频| 骚鸭AV| 日韩无码极品| 无码国产Av| 蜜臀操逼黄色视频操的好爽| 超碰碰碰碰| 厕所偷拍在线| 福利在线视频一区二区| 影音资源男人日韩| 欧美双插| 国产精品女生av| 99久久综合网| 精品人妻一区二区三区-国产| 成人热久久精品| av橘色网站| 2024黄色视频| 夜夜影视四色| 99青草| 午夜精品久久久久久久| 婷婷爽人人婷婷爽视频| 日韩在线一区高清在线| 综合久久婷婷| 性生活无遮挡纯毛片在线看| 视频二区美腿制服人妻欧美| 国产精品点击进入在线影院高清| 国产精品制服丝袜清纯唯美| 狠狠久久亚洲欧美专区| 亚洲天天影视色综合| 国产97视频| 岛国艾薇凹凸视频天堂| 夜夜中出国产| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 国产91 丝袜在线播放00-百度| 欧美精品23| 视频二区美腿丝袜制服人妻欧美| 91五月天| 国产偷拍网站| 肉动漫无遮挡h在线观看| 成人午夜无码视频| 色欲三区| 极品色综合| 草伊人高潮喷水超碰| 日本国产欧美高清在线| 视频国产成人精品日本亚洲18 | 日韩国产乱子伦App| 狠色婷婷久久一区二区三区_| 国产操逼视频在线观看| 国产视频第2页| 999精品国产高清一区二区| 久久久久ab| 国产隔壁老王影院在线| 性生活无遮挡纯毛片在线看| 日韩三级伦理中文字幕| 久超碰在| 久久粉色| 97色婷婷| 丰满人妻一区二区三区免费| 青青草日韩无码| 亚洲男人的天堂一区二区| 欧亚揄拍偷拍精品视频| 日韩本不卡视频在线观看 | 久久婷婷五月| 亚洲成成熟女人综合一区二区| 亚洲成人贴图| 久久黄色视频一区二区三区| 天天天操天天天爱| 极品欧美一区二区三区| 91蜜臀在线久久久久| 天天伊人| 亚洲综合色男人网| 99国产精品| 精品视频123区小说区| 人人操,人人液| 2019AV天堂| 伊人一区二区在线播放| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 久久久久久AⅤ无码免费肉站| 精国久久一区二区三区98| 九色在线熟女国产黑人| 少妇丝袜在线观看AV| 免费的黄片wwwwww| 中文字幕一二三av| 日本在线一二 | 日韩丝袜人妻AV| 国产在线综合网| 中文字幕-区二区三区四区视频中国| 久久精品久久久久久久久| 97色妞| 午夜高清成人在线视频| 日本男人天堂| 台湾佬中文娱乐自偷自拍| 亚洲影院365| www.高清无码诱惑一区.com| 综合操逼| 欧美性高潮| 亚洲欧美天堂在线| 日本免费专区| 九九九九一区| 啊啊啊com| www.av在线视频| 大逼色网站| 懂色AV一区二区三区| 韩美日操逼| 久久9精品网站| 亚洲男人的天堂亚洲| 日韩av电影成人在线| 欧洲精品欧洲精品| 女色视频社区| 久久久久亚洲av综合波多野制衣| 夜夜嗨一区二区三区三州加勒比| 日本欧美成人片AAAA| 狠狠操,使劲操| 97久久天天综合色天天综合色电影 | 色综合天天| 在线观看不卡一区二区三区| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 亚洲 国产 精品一区| 色综合91好| 国产精品久久久久亚洲av| 黄片免费看的| 日本99视频| 91逼逼女人91| 天天看高清麻豆| 日韩无码人妻中字久久三区四区| 啪啪视频免费在线观看| 3PAV乱伦视频| 日韩无码三级影院| 人人玩人人添人人澡免费| 翔田千里Av在线| 日韩有码 一区二区三区| 欧美一区二区三区互相| 干超碰碰熟女| 高潮精品| 日韩免费簧片| 百度百度日本操逼| 欧美一级美片在线观看免费| 亚洲春色一区二区三区| 亚洲无码日韩电影| 91麻豆天美传媒HD| 一区,二区,三区视频| 五月天婷婷欧美三区| 富女玩鸭子一级毛片| 蜜桃臀久久| 久久99精品视频| 亚洲精品少妇| 久久香蕉国产线看观看亚洲女人 | 中文字幕91综合| 久久久国产三级黄色片| 黄色欧美性爱视频| 国产91精品福利在线| 无码高清少妇久久| 人人操人人干xxx| 牛牛AV人人夜夜澡人人爽| 屁股久久久久久久| 青娱乐淫乱1314| 一起草三级AV电影在线观看 | 国模不卡| 影音先锋每日最新资源在线观看| 亚洲在线网站| 情趣丝袜无码操逼视频| 久久成人国产精品| 黄色电影在线播放综合网站| 欧美色图片91| 成人精品在线免费视频| 日1区2区3区2020| 加勒比海人人操超碰在线| 国模久久在线| 激情一区二区| 日本东京热久久久电影| 欧美日本中字另类在线| 强奸乱伦日韩AV| 深爱五月天| 91处女视频在线观看| 狠狠躁日日躁夜夜躁A| 婷婷九月丁香| 欧美999| 国产亚洲日韩在线三区黑人| 国产曰批免费观看久久久| 99ri在线视频| 欧美色图中文字幕| 日本精品一区二区三| 成人性交免费视屏| 国模私拍一区二区三区神乳| 中国探花熟女| 日韩精品人妻中文字幕有码午| 天天插夜夜爽| 唯美清纯 妖精视频| WWW操逼| 99热亚洲| 91美女在线视频| 国产嫩草精品A88AV| 日韩欧美大片免费高清啪啪| 一区三区啪啪| 爆乳免费黄网站| 久操| 欧美成人A√在线一区二区| 美女被艹尤物视频| 97蜜桃综合| 亚洲有薄码区久久在线一区| 国产精品 视频| 五月丁香社区婷婷日韩欧美精品影院 | 天天干,夜夜爽| 97亚洲资源| 精人妻无码一区二区三区伊人直播| 色亚洲欧美| 日本色色视频网站| 乱精品一区字幕二区| 97干天天| 午夜超碰| 一,爱啪啪,在线免费视频| 精品国产污一区二区三区| 亚洲在钱| 久久久久久69国产一区二区| 亚洲精品日日夜夜52| 精爱久久| 91亚洲欧美激情| 欧美精品成人在线播放| 男人兔费天堂| 色偷偷人人玩人人舔人人操人人摸人人爽 | 国产精品成久久久久午夜午夜| 综合五月婷婷| 婷婷五月天无码| 91精品老女人| 久久精品国产亚洲AV成人直播| 久偷拍| 人人妻人人玩人人澡人人爽| 强奸乱伦资源| 天天射夜夜| 黄片免费日韩| 在线观看一卡二卡| 免费99精品国产自在在线| 久久久91福利姬| 欧洲特黄毛片免费看欧洲毛片| 免费a在线播放v| 97精品视频免费| 天天看夜夜看日日干| 91久久婷婷| 夜夜高潮夜夜爽国产伦精品| 国产久久免费精品视频| 又大又黄国产| 亚洲成人ab| 国产福利第一视频| 经典丝袜一区| 人人操人人干网页| 四虎免费看黄| 少妇高潮流水av免费| 天无日色综合| 精品九九九九| 婷婷久久综合| 国产又粗又长又大的视频| 夜夜影视四色| 97精品久久久久中文字幕| 一起草欧美| 五月天综合网| 综合亚洲欧美精品日韩?v| 91超级碰碰碰| 久久9精品| 欧美1727免费观看视频| 91白嫩| 狠狠操夜夜操蜜桃视频三区| 亚洲性刺激| 色婷婷丁香五月| 男人天堂新在线| 九九久久99| 骚女天天综合网| 99色在线| 九九热九九| 一区二区三区在线资源| 97在线免费看视频| 日本久操视频| 91操熟女| 97色插| 国产精品ⅴ无码大片在线看.| 国产AV人人 夜夜人人澡| 亚洲综合另类小说色区亚洲成av人片在www | 天天澡天天爽日日av| 色欲三区| 国产精品丝袜久久亚洲不卡| 天天插夜夜操| 青青草久久| 丁香婷婷久久| 国内外内射高清视频| 欧美精品在线观看| 亚洲欧美国产中文视频| 中文字日本乱码| 久草国产在线视频| 亚洲日本大香蕉1| 91Chinese在线| 国产深夜福利| 91偷拍欧美亚洲| 美女尤物人人操| 加勒比色99999| 久久婷婷五月天| 尹人免费观看视频在线| 男女性扦B| 国产原创剧情在线丝袜| 天美传媒AV在线播放| 久久一区,青青青青草视频在线播放| 日韩人妻制服丝袜av| 色69大色97香蕉| 天天爽爽爽爽| 国产乱伦亚洲| 91丝袜熟女| 激情五月丁香五月| 最近2018中文字幕在线高清第一页| 日本不卡二三区| 亚洲中文字幕三级在线| 超碰97男女| 强上我不卡卡| 欧美劲爆视频一区二区| 亚州欧美在线| 免费网站观看www在线观| 亚洲第2页| 好吊色综合| 学生妹天天看| 国产欧美亚洲精品a第2页| 亚洲欧美综合| 97丝袜亚洲在线播放| 99久久婷婷| 一级@啪啪视频| 91亚洲综合在线| 青久操| 综合网色| 中文字幕欧美丝袜07资源| 婷婷九月国产| 国产欧美一区二区| 国产区91柔拿会所技师| 国产suv一区二区三区6| 久久蜜色情在线视频xxx免费观看| 三级片网站在线播放| 日本国产亚洲一区在线观看| 精品二区久久| 欧美综合加勒比在线| 思思热在线观看| 一级@啪啪视频| 人妻久久一区二区三区| 91网站在线播放| 性感女人网页在线观看视频| 高清国产av无码| 成年人三级黄色片视频| 清纯唯美激情| 91网站18+| 亚洲射综合网| 欧美九9 9 9| 黄色视频特级毛片| 精品国产三级av韩国在线| 久久精品成人| 97资源免费视频| 久久欧美1卡2卡3| 国产超碰在线| 亚洲 欧美 手机在线观看| 日韩欧美大片免费高清啪啪| 欧美热图99| 久久久久9999妇女| 亚洲免费精品一区| 99国产人成精品| 丰满人妻一区二区三区大胸懂色| 岛国1区2区3区在线观看| 9丨久久九九九| 中出人妻中文字幕91在线| 日韩精品怡红院| 蜜桃视频一区二区三区在线观看| 五月开心网| 激情色色| 91九色在线| 97人人操人人摸| 九九热久久99精品re| 免费a v| 亚洲久9| 99rre在线精品99re8| 亚洲欧洲无码97久久精品| 69AV女优男人的天堂| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 青青草原人妻| 狠狠操狠狠爱| 九九Av| 欧美亚洲日本激情在线| 国产激情在线| 激情接吻视频久久久久久| 99国产在线 精品 视频| 日韩精品国产一区二区| 亚洲国产精品无码AV久久久| 成人国产视频在线观看| 国产91影院| 欧美综合另类| 男同专区一区二区三区在线| 狠狠色五月亚洲91| 久久久99999久网站| 国产精品丝袜久久亚洲不卡| 2001天天操| 在现视频女上位好爽| 人妻在线中出视频| 91美乳| 91九色丨国产丨爆乳| 91伊人大香蕉| 青青草伊人久久| 丝袜综合| yy少妇精品久久| 任你干在线视频| 中文字幕欧美日本乱码一线二线| 精品一国2| 国产欧美后入| 成人在线视频一区| 日韩午夜国产| 亚洲Av噜噜一区二区三区妖精| 亚州综合色图| 欧美日韩美女精品久草一区二区三区| 亚洲骚男同com| 97资源站国产精品| 亚洲色图A| 国产无码久久高清| 人人干黄色| 操逼操逼逼操操逼91 | 亚洲天堂第一页| 人妻激情在线视频| 加勒比性爱成人在线| 久久久月天| 久久男人的天堂| 亚洲精品成人动漫在线| 午夜视频好爽啊| 夜色AV无码手机在线影院| 开心激情婷婷| 九九玖玖精品| 97精品久久久久中文字幕| 亚洲图片 欧美电影| 天天日天天看| 国产偷人伦激情在线观看| 岛国网址国产| 日欧操屄视频| 97色爱| 少妇久久久免费| chaopen97久久| 2020中文字幕在线观看| 自拍偷拍草一草| 探花一区二区三| 国产热RE99久久6国产精品首| 青草青青久久久久久国产| 97精品国产97久久久久久| 爱干爱射网啊啊啊| 天天情欲宗合网| 女人天堂av在线播放| 这里只有精品视频在线观看麻豆| 中文操逼字幕| 欧美综合第一页| 无码人妻一区二区三区色欲aⅴ| 久操网线| 老鸭窝亚洲毛片| s片在线观看| 精品人妻少妇| 欧美午夜视频免费观看| 色五月综合| 青青草视频导航官网| 青青草一区二区高清无码视频| 无码直播久久久| 999岛国大片| 欧美久久毛片基地| 99re这里只有精品2| 九九综合九九综合| 亚洲中文字母在线播放| 天天综合网91入口| 人妻无码后入| 99热在线只有精品| 6080YYY午夜理论片在线观看| 91欧美| 91爰爱欧美| 99999精品| 色一色综合网| 色九久| 欧美亚男人的天堂| 色五月激情AV在线| 麻豆国产97在线| 人人透人人操| 中文字幕一区 二 区 三 四 五 区日 日 骚 | oumeizonghese,www| 性色aV一区二区三区噜噜| 亚洲啪啪视频免费| 99综合网| 91在线国产后入风骚翘臀美女素人| …亚洲黄色厕厕女女在线播…| 色综合久久88色综合久久天天| 操B久久| 亚洲动态色图| 欧美网站免费| 欧美 亚洲 综合 制服 另类| 婷婷伊人五月| 99这里有精品| 日韩欧美蜜桃精品久久中文字幕久久| 伊人骚琪琪亚洲天堂网站| 国模吧 一区二区三区| 欧美中文狠| 欧美人人曰人人操人人射射| oumeisetu综合| 国内外激情在线| 福利在线黄片| 欧美精品三区| 欧美性爱无码一区二区三区| 欧美日韩国产中文精品字幕自在自线,| 91宗合网|