日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

Tomcat8+Java7+ExtJS WebSocket聊天室實戰(zhàn)

Tomcat8+Java7+ExtJS WebSocket聊天室實戰(zhàn) 簡介一套基于 Tomcat8、Java7 與 ExtJS 搭建的 WebSocket 實時聊天室完整源碼面向已具備 Java Web 基礎、希望打通服務端推送與富客戶端界面聯(lián)動的開發(fā)者。服務端依托 Tomcat8 容器與 JSR 356 提供的 javax.websocket 端點通過 ServerEndpoint 生命周期回調、連接池管理與消息廣播完成收發(fā)前端用 ExtJS 組件搭建輸入框、消息列表與聊天窗口可作為實時通信從入門到進階的實踐樣本。壓縮包共 1753 個文件、約 7.01MB其中大量 gif 與 png 為框架圖標及主題素材scss 與 css 對應皮膚樣式js 承載前端邏輯與組件定義另有少量 java、class、jar 及 xml 構成服務端代碼與工程配置。已有 263 人學習下載。讀者可據此理清握手連接、消息編解碼、在線用戶管理與歷史消息展示的完整鏈路并參考其中的部署調試思路。1. 從一個內網協(xié)作需求說起Tomcat8 Java7 ExtJS 的聊天室為什么還要手寫 WebSocket某內網協(xié)作工具的前端是 ExtJS 管理臺后端只有 Tomcat8 和 Java7需求是在不改動現(xiàn)有部署結構的前提下加一個聊天室群聊、私聊、在線列表、斷線重連。很多同學第一反應是上 Spring Boot 或 Node但現(xiàn)場環(huán)境不允許加新運行時于是把目光放回 Tomcat8 自帶的 JSR-356 WebSocket。這套源碼和工具清單圍繞一個最小閉環(huán)展開服務端用ServerEndpoint管連接前端用 ExtJS 封裝適配器消息走 JSON 協(xié)議最后用檢查表驗收。適合正在做聊天室畢設或課設的人也適合要在老管理臺里嵌實時消息的開發(fā)者。2. 總體架構與技術選型連接層、路由層、視圖層的職責邊界2.1 選型對比輪詢、長輪詢與 JSR-356 原生 WebSocket聊天室最核心的動作是“服務端有新消息時瀏覽器能立刻知道”。用傳統(tǒng)輪詢前端每隔幾秒發(fā)一次請求消息延遲取決于輪詢間隔連接數(shù)一多Tomcat 的線程池會被大量空請求占住長輪詢稍好一點但每次消息推送都要重新建立一次 HTTP 請求服務端和前端都要維護掛起狀態(tài)代碼復雜度并不低。SSE 是單向推送做在線列表廣播夠用但私聊和“正在輸入”這類客戶端到服務端的事件還得另開接口協(xié)議會變成兩套。Tomcat8 實現(xiàn)了 JSR-356也就是 Java API for WebSocket服務端用注解聲明端點容器負責握手和幀解析。對這套項目來說選它的理由很直接不新增運行時不引入額外容器Java7 能編譯ExtJS 前端用瀏覽器原生WebSocket對象就能對接。代價是 JSR-356 只提供連接和消息收發(fā)會話表、消息路由、心跳、重連都要自己寫。這恰好是方案里最值得展開的部分也是課程設計能講出設計含量的地方。方式實時性服務端資源占用前端改造量適用場景短輪詢秒級延遲空請求多小消息頻率極低長輪詢準實時掛起連接多中兼容舊瀏覽器SSE單向實時連接常駐中通知、廣播WebSocket雙向實時連接常駐但幀開銷小中聊天室、協(xié)作提示選型表不要只寫“WebSocket 更好”要把“為什么當前環(huán)境不能選別的”寫清楚答辯時老師通常會追問這一句。2.2 三層架構接入層、會話路由層、ExtJS 視圖層這套聊天室按三層劃分。接入層由 Tomcat8 的 WebSocket 容器承擔負責 HTTP Upgrade 握手、幀的編解碼、連接超時控制會話路由層是 Java 代碼里的 Endpoint、SessionRegistry 和 MessageRouter負責“誰在線”“消息發(fā)給誰”“發(fā)不出去怎么清理”視圖層是 ExtJS 的聊天面板、在線用戶表格和輸入框負責把用戶操作變成 JSON 幀把收到的 JSON 幀變成 Store 里的記錄。三層之間只靠 JSON 消息協(xié)議耦合前端不關心服務端用的是ConcurrentHashMap還是別的會話容器服務端也不關心 ExtJS 用的是 Grid 還是 DataView。這樣做的好處是后面要把在線列表從表格換成樹、要把消息存儲從內存換成表改動都收在一層里。課程設計里常犯的錯是把廣播邏輯寫進前端讓每個客戶端收到消息后再轉發(fā)給別人結果一端掉線整條鏈路就斷這種設計在答辯時很容易被問住。數(shù)據流可以按一條群聊消息走一遍用戶在 ExtJS 輸入框點發(fā)送適配器把{type:chat, to:all, content:...}轉成字符串通過WebSocket.send()發(fā)到/chat/{userId}服務端OnMessage收到后解析 type交給 MessageRouterRouter 從 SessionRegistry 取出所有在線 Session逐個調用發(fā)送方法每個前端收到后把消息 add 到消息 Store聊天面板只渲染新增行。整條鏈路里沒有輪詢也沒有額外 HTTP 接口。2.3 四個核心模塊與目錄劃分把代碼按職責拆成四個模塊后面排查問題時能快速定位。連接管理模塊負責ServerEndpoint的生命周期方法和 Session 注冊注銷消息路由模塊負責協(xié)議解析、群聊廣播、私聊定向發(fā)送在線狀態(tài)模塊負責用戶列表和最后活躍時間前端適配模塊負責 ExtJS 的 WebSocket 封裝、重連和 Store 聯(lián)動。目錄不必照搬某個框架但要讓別人一眼看出哪塊歸哪塊。webapp/ chat/ app/ view/ # ChatPanel、OnlineGrid、MessageList store/ # OnlineUsers、Messages ux/ # WebSocketAdapter controller/ # ChatController app.js src/ main/ java/ com/example/chat/ ws/ # ChatEndpoint、ChatConfigurator service/ # SessionRegistry、MessageRouter model/ # ChatMessage、UserSession上面這份目錄把“連接”和“路由”分開放ws包只處理 WebSocket 協(xié)議層的事情service包不依賴javax.websocket之外的容器類。實際交付時如果項目是傳統(tǒng) Web 工程而不是 Maven 結構把src換成src/main/java對應的源碼目錄即可包名保持一致后面貼的代碼不用改。2.4 連接生命周期與數(shù)據流JSR-356 的端點有四個生命周期回調OnOpen在握手成功后觸發(fā)OnMessage在收到文本或二進制幀時觸發(fā)OnClose在連接關閉時觸發(fā)OnError在連接或發(fā)送出錯時觸發(fā)。聊天室的會話表就在OnOpen里寫入在OnClose和OnError里刪除。這里有一個容易被忽略的點OnClose不保證一定執(zhí)行比如進程被 kill、網絡中途斷開、容器強制回收所以發(fā)送消息時還要做一次session.isOpen()判斷和失敗清理不能只依賴關閉回調。連接建立后前端適配器會先發(fā)一條join消息服務端回一條online消息帶當前在線列表之后每 25 秒發(fā)一次ping服務端回pong同時刷新該用戶的最后活躍時間。超過 60 秒沒有收到任何幀Tomcat 會按setMaxIdleTimeout關閉連接前端收到onclose后進入重連流程。這個“心跳 空閑超時 前端重連”的組合是后面驗收時最能體現(xiàn)設計完整性的部分。3. 服務端落地會話表、消息協(xié)議與心跳清理的 Java7 寫法3.1 ServerEndpoint 的生命周期方法與參數(shù)獲取服務端端點用注解聲明路徑把用戶標識放在路徑參數(shù)里前端連接時拼上去。這樣不用在握手階段解析 query stringPathParam在OnOpen和OnMessage里都能直接拿到。Java7 沒有 lambda集合初始化用傳統(tǒng)寫法代碼看起來啰嗦一點但和 Tomcat8 的 JSR-356 實現(xiàn)完全兼容。ServerEndpoint(value /chat/{userId}, configurator ChatConfigurator.class) public class ChatEndpoint { private static final ConcurrentHashMapString, Session ONLINE new ConcurrentHashMapString, Session(); private static final ConcurrentHashMapString, Long LAST_ACTIVE new ConcurrentHashMapString, Long(); OnOpen public void onOpen(Session session, PathParam(userId) String userId) { // 空閑超時設成 60 秒前端 25 秒發(fā)一次心跳留出重試余量 session.setMaxIdleTimeout(60000L); ONLINE.put(userId, session); LAST_ACTIVE.put(userId, Long.valueOf(System.currentTimeMillis())); // 把當前在線用戶推給新連接格式由 MessageRouter 統(tǒng)一封裝 MessageRouter.sendOnlineList(session, ONLINE.keySet()); } OnMessage public void onMessage(String text, Session session, PathParam(userId) String userId) { LAST_ACTIVE.put(userId, Long.valueOf(System.currentTimeMillis())); ChatMessage msg ChatMessage.parse(text); if (msg null) { MessageRouter.sendError(session, BAD_MESSAGE); return; } MessageRouter.route(userId, msg); } OnClose public void onClose(Session session) { String userId session.getPathParameters().get(userId); if (userId ! null) { ONLINE.remove(userId, session); LAST_ACTIVE.remove(userId); MessageRouter.broadcastOnlineList(ONLINE.keySet()); } } OnError public void onError(Session session, Throwable error) { String userId session.getPathParameters().get(userId); if (userId ! null) { ONLINE.remove(userId, session); LAST_ACTIVE.remove(userId); } // 這里只記日志不再向已出錯的連接寫消息 LoggerFactory.getLogger(ChatEndpoint.class).error(ws error, user userId, error); } }這段代碼里ONLINE.remove(userId, session)用了雙參數(shù)刪除只有當前 Session 和表里的一致才刪避免用戶重連后舊連接的OnClose把新連接誤刪。setMaxIdleTimeout(60000L)的單位是毫秒前端心跳間隔要小于它否則連接會被容器提前關掉。ChatConfigurator用來在握手前做 Origin 校驗或注入依賴如果沒有額外配置可以去掉 configurator 屬性不影響主流程。3.2 會話表設計ConcurrentHashMap 與用戶維度索引會話表用ConcurrentHashMapString, Sessionkey 是用戶 IDvalue 是當前連接。聊天室場景讀多寫少廣播時要遍歷所有 SessionConcurrentHashMap的弱一致性迭代器允許遍歷時發(fā)生刪除不會拋ConcurrentModificationException。如果要支持同一賬號多端登錄value 要換成SetSession或CopyOnWriteArrayListSessionkey 仍然用用戶 ID發(fā)送時對該用戶的所有連接逐個寫。在線狀態(tài)還需要一張“最后活躍時間”表用來做兜底清理。Tomcat 的空閑超時會關閉連接但某些網絡環(huán)境下關閉事件可能延遲定時任務每 30 秒掃一遍LAST_ACTIVE超過 90 秒沒有更新的用戶直接從ONLINE里移除并廣播在線列表。這個定時任務用ScheduledExecutorService起單線程就夠不要每個連接起一個線程否則連接數(shù)一多線程數(shù)會失控。public final class SessionRegistry { private static final ScheduledExecutorService CLEANER Executors.newSingleThreadScheduledExecutor(); static { CLEANER.scheduleAtFixedRate(new Runnable() { public void run() { long now System.currentTimeMillis(); for (Map.EntryString, Long entry : ChatEndpoint.LAST_ACTIVE.entrySet()) { if (now - entry.getValue().longValue() 90000L) { Session session ChatEndpoint.ONLINE.remove(entry.getKey()); ChatEndpoint.LAST_ACTIVE.remove(entry.getKey()); closeQuietly(session); } } } }, 30L, 30L, TimeUnit.SECONDS); } private static void closeQuietly(Session session) { if (session ! null session.isOpen()) { try { session.close(new CloseReason( CloseReason.CloseCodes.GOING_AWAY, idle timeout)); } catch (IOException ignored) { // 關閉失敗不再重試Map 已經移除連接會被容器回收 } } } }這段清理邏輯的關鍵參數(shù)是 90 秒閾值它要比setMaxIdleTimeout的 60 秒大給容器留出關閉和回調的時間。closeQuietly里捕獲IOException后不再重試因為會話已經從表里移除重試沒有意義反而可能把異常日志刷滿。定時任務用靜態(tài)塊啟動項目里如果有 Spring 容器可以改成PostConstruct初始化但不要在每次連接時新建線程池。3.3 消息協(xié)議與路由群聊、私聊、系統(tǒng)消息消息協(xié)議用 JSON字段不多但要在前端和服務端保持一致。type區(qū)分消息類型from由服務端根據路徑參數(shù)填to對群聊填all對私聊填目標用戶 IDcontent是文本內容ts是服務端時間戳。服務端解析后不信任前端傳來的from統(tǒng)一用路徑參數(shù)覆蓋避免冒充。協(xié)議表如下字段類型說明typestringchat、private、system、ping、pong、onlinefromstring服務端填充的發(fā)送者 IDtostringall 或目標用戶 IDcontentstring文本內容system 消息為提示文案tslong服務端毫秒時間戳usersarray僅 online 消息攜帶在線用戶 ID 列表路由方法收到chat時遍歷ONLINE廣播收到private時只發(fā)給to對應的 Session收到ping時回pong。廣播時不要在主線程里同步寫所有連接某個客戶端網絡慢會拖住整個廣播可以把每個發(fā)送包成一個任務丟給線程池但線程池要有界隊列滿了就丟棄并記日志避免消息堆積把內存撐爆。課程設計規(guī)模小直接同步寫也可以但要在代碼注釋里寫清楚這是簡化處理答辯時能說明取舍。public static void route(String from, ChatMessage msg) { if (ping.equals(msg.getType())) { sendText(ONLINE.get(from), {\type\:\pong\,\ts\: System.currentTimeMillis() }); return; } if (chat.equals(msg.getType())) { msg.setFrom(from); msg.setTs(System.currentTimeMillis()); String json msg.toJson(); for (Session session : ONLINE.values()) { sendText(session, json); } return; } if (private.equals(msg.getType())) { msg.setFrom(from); msg.setTs(System.currentTimeMillis()); Session target ONLINE.get(msg.getTo()); if (target null) { sendError(ONLINE.get(from), USER_OFFLINE); return; } sendText(target, msg.toJson()); sendText(ONLINE.get(from), msg.toJson()); } }route里對私聊做了“發(fā)給目標并回顯給發(fā)送者”的處理前端不用自己往消息列表里補一條所有消息都以服務端回執(zhí)為準這樣多端登錄時消息順序一致。sendText內部要做空判斷和isOpen判斷發(fā)送失敗時從ONLINE移除對應會話避免壞連接一直留在表里。3.4 心跳、空閑超時與失效會話清理心跳不是業(yè)務消息但它是聊天室能不能長期掛住的關鍵。前端每 25 秒發(fā)一次ping服務端在OnMessage里刷新LAST_ACTIVE并回pong。如果前端連續(xù)三次沒有收到pong就主動關閉連接并進入重連。服務端這邊setMaxIdleTimeout(60000L)是容器級兜底定時清理是應用級兜底兩層機制同時存在任何一層失效另一層還能收住。發(fā)送方法要加鎖原因是 JSR-356 的RemoteEndpoint.Basic不保證線程安全多個業(yè)務線程同時往同一個 Session 寫可能出現(xiàn)IllegalStateException或消息截斷。用synchronized (session)包住sendText是最簡單的做法連接數(shù)不大時開銷可以接受。如果追求吞吐可以改用getAsyncRemote()加發(fā)送隊列但異步發(fā)送的回調里不能再同步寫同一個 Session否則會死鎖。這部分在下一章的避坑里還會展開。public static void sendText(Session session, String text) { if (session null || !session.isOpen()) { return; } synchronized (session) { try { session.getBasicRemote().sendText(text); } catch (IOException e) { // 寫失敗說明連接已經不可用直接從在線表移除 String userId session.getPathParameters().get(userId); if (userId ! null) { ONLINE.remove(userId, session); } } } }sendText是整套服務端代碼里被調用次數(shù)最多的方法廣播、私聊、系統(tǒng)提示都走它。把空判斷、鎖、失敗清理收在一個方法里路由層就不用重復寫這些邊界處理。注意session.getPathParameters()在OnClose之后調用可能返回空 Map所以移除時先判斷userId是否為 null避免ConcurrentHashMap的 key 為 null 拋異常。4. 前端落地ExtJS 組件樹與 WebSocket 適配器的對接方式4.1 ExtJS 視圖結構Viewport、聊天面板、在線列表、輸入區(qū)前端用 ExtJS 的 Viewport 做整體布局左側是在線用戶 Grid右側是消息列表加輸入區(qū)。消息列表可以用Ext.view.View配itemTpl也可以用 Grid 配列前者渲染輕、適合消息流后者方便做“按用戶篩選”。在線列表用 GridStore 的字段是userId、name、status收到online消息時整表替換收到用戶上下線時增量 add/remove。輸入區(qū)用Ext.form.Panel回車發(fā)送發(fā)送按鈕在請求發(fā)出后置灰收到服務端回顯再恢復。組件樹不要建得太深聊天面板里套太多panel會讓布局計算變慢消息一多就能感覺到卡頓。消息列表用flex: 1撐滿剩余高度輸入區(qū)固定高度在線列表給一個最小寬度。所有需要隨窗口變化的地方用layout: border或layout: fit不要用絕對定位否則分辨率一變就錯位。4.2 WebSocket 適配器連接、重連、事件總線ExtJS 沒有內置 WebSocket 類需要自己封一個Ext.util.Observable子類把onopen、onmessage、onclose、onerror轉成 ExtJS 事件。適配器負責拼 URL、發(fā)消息、心跳、重連業(yè)務控制器只監(jiān)聽message和open事件。這樣控制器里不出現(xiàn)原生WebSocketAPI后面換傳輸方式也不用改業(yè)務代碼。Ext.define(Chat.ux.WebSocketAdapter, { extend: Ext.util.Observable, config: { url: null, userId: null }, constructor: function (config) { this.initConfig(config); this.callParent(arguments); this.reconnectDelay 1000; this.maxDelay 30000; this.manualClose false; this.heartbeatTimer null; this.connect(); }, connect: function () { var me this; me.socket new WebSocket(me.getUrl() / encodeURIComponent(me.getUserId())); me.socket.onopen function () { me.reconnectDelay 1000; me.startHeartbeat(); me.fireEvent(open); }; me.socket.onmessage function (event) { var msg Ext.JSON.decode(event.data, true); if (msg) { me.fireEvent(message, msg); } }; me.socket.onclose function () { me.stopHeartbeat(); me.fireEvent(close); if (!me.manualClose) { me.scheduleReconnect(); } }; me.socket.onerror function () { me.fireEvent(error); }; }, startHeartbeat: function () { var me this; me.stopHeartbeat(); me.heartbeatTimer setInterval(function () { me.send({ type: ping, ts: new Date().getTime() }); }, 25000); }, stopHeartbeat: function () { if (this.heartbeatTimer) { clearInterval(this.heartbeatTimer); this.heartbeatTimer null; } }, scheduleReconnect: function () { var me this; setTimeout(function () { me.connect(); }, me.reconnectDelay); me.reconnectDelay Math.min(me.reconnectDelay * 2, me.maxDelay); }, send: function (obj) { if (this.socket this.socket.readyState WebSocket.OPEN) { this.socket.send(Ext.JSON.encode(obj)); } }, close: function () { this.manualClose true; this.stopHeartbeat(); if (this.socket) { this.socket.close(); } } });適配器里reconnectDelay從 1 秒開始翻倍上限 30 秒避免服務端重啟時所有客戶端在同一秒重連把連接數(shù)打滿。manualClose用來區(qū)分“用戶主動關閉”和“網絡異常關閉”主動關閉不觸發(fā)重連。Ext.JSON.decode(event.data, true)的第二個參數(shù)是安全模式解析失敗返回 null不會拋異常打斷事件循環(huán)。心跳定時器在onclose里必須清掉否則重連后會有多個定時器同時發(fā) ping。4.3 Store 與消息渲染避免全量重繪消息 Store 的字段包括from、content、ts、type收到chat或private消息時用store.add追加一條不要用loadData全量替換。全量替換會讓整個消息列表重新渲染消息一多就能看到明顯閃爍而且滾動位置會丟。追加之后判斷用戶是否在底部如果在底部就滾到底如果用戶正在往上翻歷史消息就不要強制滾動給一個“有新消息”的提示按鈕。在線用戶 Store 的更新策略相反online消息到達時可以loadData全量替換因為在線列表通常只有幾十條全量替換的代價比逐條比對小。但userOnline和userOffline這類增量消息要用add和remove不要每次都全量拉一遍。兩個 Store 的更新方式分開是前端性能上最容易被忽略的一點。Ext.define(Chat.controller.ChatController, { extend: Ext.app.Controller, init: function () { var me this; me.adapter Ext.create(Chat.ux.WebSocketAdapter, { url: ws:// location.host /chat, userId: window.currentUserId }); me.adapter.on(message, me.onWsMessage, me); me.adapter.on(open, me.onWsOpen, me); }, onWsOpen: function () { this.adapter.send({ type: join }); }, onWsMessage: function (msg) { var msgStore Ext.getStore(Messages); var onlineStore Ext.getStore(OnlineUsers); if (msg.type chat || msg.type private || msg.type system) { msgStore.add({ from: msg.from, content: msg.content, ts: msg.ts, type: msg.type }); this.scrollToBottomIfNeeded(); return; } if (msg.type online) { onlineStore.loadData(msg.users || []); return; } if (msg.type userOnline) { onlineStore.add({ userId: msg.userId, status: online }); return; } if (msg.type userOffline) { onlineStore.remove(onlineStore.getById(msg.userId)); } }, scrollToBottomIfNeeded: function () { var view Ext.getCmp(messageList).getView(); var el view.getEl(); if (el el.dom.scrollHeight - el.dom.scrollTop - el.dom.clientHeight 40) { el.dom.scrollTop el.dom.scrollHeight; } } });控制器只做分發(fā)不直接操作 WebSocket 對象消息 Store 和在線 Store 的更新邏輯分開寫。scrollToBottomIfNeeded里的 40 像素閾值是經驗值小于這個距離視為“用戶在底部”可以自動滾動超過這個距離說明用戶正在看歷史消息不要打擾。Ext.getCmp在大型項目里不推薦但聊天室這種單頁面夠用如果控件有reference用lookupReference更穩(wěn)。4.4 前端協(xié)議對接與錯誤提示前端發(fā)消息時不要帶from服務端會覆蓋私聊消息帶to群聊to填all。發(fā)送前做一次空內容判斷連續(xù)回車不要發(fā)空消息。服務端返回error類型時在輸入區(qū)上方顯示一行提示不要用alert打斷用戶。連接斷開時把輸入框置灰重連成功后恢復用戶不需要手動刷新頁面。錯誤碼不要太細前端只需要區(qū)分“消息格式錯誤”“對方不在線”“連接已斷開”三類。BAD_MESSAGE通常是前端 JSON 拼錯開發(fā)階段出現(xiàn)上線后不應該出現(xiàn)USER_OFFLINE是正常業(yè)務分支提示“對方已離線”即可連接斷開由適配器的close事件統(tǒng)一處理不需要服務端再發(fā)錯誤消息。把這三類分開前端提示文案不會互相覆蓋。5. 避坑與排查握手 404、并發(fā)寫、會話泄漏等五個高頻問題5.1 握手 404路徑、容器依賴與打包沖突現(xiàn)象是瀏覽器控制臺報WebSocket connection to ws://... failed: Error during WebSocket handshake: Unexpected response code: 404服務端日志里看不到OnOpen。原因通常有三種前端拼的路徑和服務端ServerEndpoint的值不一致項目把websocket-api.jar打進了WEB-INF/lib和 Tomcat 自帶的實現(xiàn)沖突web.xml的metadata-completetrue讓容器不掃描注解。解決時先看 Tomcat 的logs/localhost日志有沒有端點注冊信息再檢查WEB-INF/lib里有沒有websocket-api或tomcat-websocket的 jar有就移掉編譯期依賴用providedscope。路徑上注意前后端都帶沒帶尾斜杠/chat/{userId}和/chat/是兩回事。5.2 并發(fā)寫異常RemoteEndpoint 的線程安全問題現(xiàn)象是廣播時偶爾拋java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING]或者某個客戶端收到的消息少了一段。原因是多個線程同時調用同一個 Session 的getBasicRemote().sendText()JSR-356 不保證RemoteEndpoint.Basic的線程安全。解決方法是給發(fā)送方法加synchronized (session)把同一個 Session 的寫操作串行化如果連接數(shù)很大改成每個 Session 一個發(fā)送隊列由單線程消費隊列業(yè)務線程只入隊。不要在被鎖住的代碼里做 JSON 序列化以外的耗時操作否則廣播會被慢客戶端拖住。5.3 會話泄漏onClose 沒觸發(fā)與 Map 只增不減現(xiàn)象是運行一段時間后在線列表里出現(xiàn)已經關掉頁面的用戶廣播時sendText一直失敗內存緩慢上漲。原因是OnClose在網絡異常、容器強制回收、進程被 kill 時不一定執(zhí)行而代碼只依賴OnClose刪除會話。解決方法是三層兜底發(fā)送失敗時從ONLINE移除LAST_ACTIVE超過閾值由定時任務清理OnError里也執(zhí)行移除。移除時用remove(key, value)雙參數(shù)版本防止舊連接的回調誤刪新連接。上線前用jmap或容器自帶的管理頁看一次 Session 數(shù)量連接關閉后數(shù)量應該回落。5.4 重連風暴前端退避與后端限流現(xiàn)象是服務端重啟或網絡抖動后所有客戶端在同一秒重連Tomcat 的線程數(shù)瞬間打滿日志里大量握手失敗。原因是前端重連間隔固定沒有退避也沒有隨機抖動。解決方法是在適配器里做指數(shù)退避間隔從 1 秒翻倍到 30 秒并在每次間隔上加 0 到 1 秒的隨機數(shù)把重連時間打散。服務端可以在ChatConfigurator的beforeRequest里按 IP 做簡單的計數(shù)限流超過閾值直接拒絕握手。不要在前端用setInterval無限重試重試次數(shù)要有上限超過之后提示用戶手動刷新。5.5 跨域與接入層配置Origin 校驗與超時參數(shù)現(xiàn)象是本地開發(fā)時前端頁面在 8080WebSocket 服務在另一個端口瀏覽器握手被拒絕或者經過接入層轉發(fā)后Upgrade頭丟失握手變成普通 HTTP 請求。原因是 WebSocket 握手雖然不受同源策略的完全限制但瀏覽器會帶Origin服務端可以校驗接入層如果沒有放行Upgrade和Connection頭握手無法完成。解決方法是在ChatConfigurator里讀取Origin只允許配置過的域名接入層配置里顯式放行Upgrade、Connection頭并把讀超時調大至少大于心跳間隔。本地開發(fā)可以把前端和服務端配到同一個端口用相對路徑拼ws://減少跨域變量。注意接入層配置改完后先用瀏覽器開發(fā)者工具的 Network 面板看握手響應碼101 才是切換協(xié)議成功200 或 403 都要回頭查 Origin 和路徑。6. 驗收與答辯一份能現(xiàn)場演示的檢查表和講解順序驗收不要只看“能發(fā)消息”要按連接生命周期逐項過。下面這份表可以直接當答辯演示腳本每項操作完看一眼瀏覽器和服務端日志通過標準寫清楚避免現(xiàn)場扯皮。檢查項操作通過標準連接建立打開兩個瀏覽器窗口分別登錄不同用戶服務端日志出現(xiàn)兩次onOpen在線列表顯示兩人群聊廣播A 發(fā)一條群聊B 觀察B 立刻收到消息順序與發(fā)送順序一致私聊定向A 選擇 B 發(fā)私聊C 觀察只有 B 和 A 收到C 不出現(xiàn)該消息在線列表關閉 B 的頁面A 的在線列表在數(shù)秒內移除 B心跳與超時斷網 30 秒再恢復前端進入重連恢復后能繼續(xù)收發(fā)會話釋放連續(xù)開關頁面 20 次服務端ONLINE大小回落到實際在線數(shù)并發(fā)發(fā)送兩個用戶同時快速發(fā)消息不出現(xiàn)IllegalStateException消息不串行錯亂答辯講解按“需求—選型—數(shù)據流—演示—排錯”的順序走不要一上來念代碼。先用一句話說清楚為什么不用輪詢內網環(huán)境已有 Tomcat8JSR-356 不需要新增運行時實時性更好。然后畫一條消息從 ExtJS 輸入框到對方 Store 的路徑指著代碼說清楚OnOpen注冊、route分發(fā)、sendText加鎖這三處。演示時故意關掉一個窗口讓對方看到在線列表變化再故意斷網幾秒讓重連退避生效。老師如果問“消息可靠嗎”不要答“可靠”答“當前是內存態(tài)服務端不持久化斷線期間的消息不補發(fā)這是這套方案的邊界如果要補發(fā)得加消息表和離線隊列”。把邊界說清楚比硬撐更加分。我最早做這套聊天室時只測了兩個人正常發(fā)消息沒測“關頁面后會話有沒有刪”結果演示到一半在線列表里掛著一排已離線用戶現(xiàn)場很尷尬。從那以后我每次交付前都強制走一遍斷線重連和會話清理的檢查希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
午夜黄色免费在线观看| 91女人的网站| 亚洲综合一| 精品传媒在线一区| 国产92麻豆天美精品色欲5| 欧美成人都市人妻| 女生看匆91网站| 亚洲精品国产熟女| 国产久久日韩网站导航| 91久久精品美女高潮喷水| 欧美一级A一级a爱片久久| 久久社区一区二区三区| 夜夜高潮夜夜爽| 国产尤物在线三区| 国产精品欧美激在线| 老熟乱一区二区三区四区| 99re公开精品免费视频| 久久最新视频免费观看| 亚洲有薄码区久久在线一区| 美女t无毒不卡不卡| 婷婷色综合欧美日韩| 天堂69亚洲精品中文字| 熟女精品va中文字幕| 亚洲污一污二| 999久久久| 久久97| 人妻酒店出差被中出免费在线播放| www男人天堂| 精品成人亚洲午夜电影| 欧洲亚洲人妻无码中字久久三区四区| 91熟女丨91老女人| 天美av在线观看| 超碰色老头| 五月天婷婷色色| 后入式福利| 人人摸人人叼| 九九色热| 一区二区三区四区五区高清无码永久视频 | 91精品国产高清久久久久久,亚洲成人 | 99热在线只有精品| 婷婷五月天综合网| 天久久久噜噜噜久久国产精品爽爽 | 久久久97| 男人天堂免费| 婷婷五月天基地| 98超碰欧美| 午夜精品视频777| 风间由美日韩欧美久久| 啪啪一区| 久久久精品中文字幕爱豆| 立川理惠加勒比无码| 青青久久久| 99re国产中文字幕| 青青草原香蕉日本Ap| 五月天激情网站| 亚洲欧美伦综合| 丁香五月激情综合国产| 亚洲欧美不卡线| 精品久久在线区一区| 精品久久久久久AV无码| 97国产伦理| 婷婷久草| 国产毛片久久久久久久| 四虎影视永久在线观看精品免费网站| 看一级特黄a大一片| 一本色道久久综合狠狠操| a在线观看| A级在线视频| 婷婷激情一区二区三区俺也去| 不卡中文字幕aⅴ在线| 日日黄色三级网站| AA丁香综合激情| 欧美黄色片AAAAA| 亚洲黄色| 试看60秒| 91 亚洲 欧洲| 色综合av男人天堂| 久久AV无码AV| 啊啊啊啊啊啊好多水| 亚洲日韩青青草色月| 亚洲av综合色区图片亚洲| 久久久免费视频18| 亚洲AO在线| 亚洲四虎熟女精品| 99re热有精品视频国产| 极品欧美一区二区三区| 草B在线| 91在线欧色| 在线免费观看高清无码视频| 日本 免费 一区二区三区 久久香蕉| 秋霞无码av鲁丝片一区| 色哟哟AⅤ| 日本孕妇孕交| 久久AV无码1区2区3区| 男人的天堂一区三区| 久久久久久网址| 91操熟妇| 精吧天堂| 久久久久久性爱视频| 国产精品欧美日韩久久| 国产精品片| 亚洲日韩资源| 国产一| 国产婷婷一区| 99在线免费观看| 操日韩第| 影音先锋日本乱伦| 俞拍久久国应视频| 美女9118禁| 91国产美女丝袜足交精品视频| 99精品网| 大香蕉久久| 交换娇妻呻吟声不停中文字幕| 亚洲毛片久久| 欧美性夜| 亚洲天堂少妇| 日本精品久久久久久久| 中文在线久久字幕| 亚洲不卡不卡中文字幕不卡| 丁香五月婷婷基地| 无码少妇精品一区二区60岁老人| 欧美性爱视频免费一区一A| 免费观看性欧美一级| 开心激情婷婷| 99久久精品国产高潮| 国产家庭乱伦性爱视频| 成人一二| 国产精品又黄又猛又粗| 亚洲国产丝袜熟女av| 久久蜜桃一区二区| 欧美啪啪啪91| 日产操逼| 一本色道综合久久欧美| 国产区日韩区在线观看| 无码137片内射在线影院| 一区二区三| 本道综合精品| 五月丁香激情四射| 网站A V在线| 九久久九九久视频| 欧美78P| 欧美瑟综合| 超碰久草| www.狠狠| 久久婷婷六月综合| 精品一区二区三区蜜桃臀赵总| 99久久网站| 色五月婷婷五月天| 青青草九九九九九| 殴美综合色88| 美女黄页网站| 九九九精品| 五月天综合网| 久久人人爽人人爽人人片Ⅴ| 五月丁香啪啪网| 久久啊哟| 久久岛国| 97超碰香蕉| 黑人美精品 A片| 欧美日韩亚洲国产中文永久天天看| 日韩欧美中文字| 四季AV一区二区凹凸精品小说| 色噜噜婷婷| 91精品女厕偷拍视频| 少妇一级婬片免费放一级a性色.| 久久国产精品视频| 五月天婷婷激情| 在线观看一卡二卡| 啊啊啊好湿久久| 视频在线观看一二三区| 有码色中文字幕在线观看| 超碰久久草| 中文字幕福利视频一区二区三区在线观看| 国产午夜福利专区综合| 久久露脸国产老熟女| 亚洲色图在线视频| 欧洲亚洲人人爽爽视频| 国产一区二区在线播放| 亚洲无线码欧洲精品区别| 一起草精品人妻| 91女人的网站| 欧美草草高清日韩视频| 91精品久久久| 另类小说五月天| 人妻酒店出差被中出免费在线播放| 91综合天天看| 黄色电影在线播放综合网站 | 国产a片操逼| 91精品啪在线观看国产城中村| 一区二区日韩欧美久久| 精品999日本| 五月天久久人妻| 综合伊人激情| 午夜免费视频1000| 精品久久97| 国产精品无套内谢| 国产人伦精品一区二区三区| 亚洲激情欧美色图 | 狠狠色噜噜狠狠狠狠2018| 97综合在线| 人妻在线大香蕉| 网友自拍第1页 | 欧美色性爱| 国产馆极品诱惑| 91劲爆| 色综合一本| 亚洲aV性爱| 久久久久久久久久久久黄色| 1区2区3区视频| 欧美成人一区二区三区在线播放| 美女主播色欲91抠b在线播放| 久久久久夜夜夜夜| AV电影在线播放| 久久久久密臀视频| 日本成人免费一区二区三区| 青青草在线视频美女| 人人性爱视频免费| 精品福利视频| 亚洲图片欧美色图| 性色一线| 人妻少妇精品| 国产这里只有精品| 91精品国| 在线国产探花| 日日AAvv| 婷婷综合五月| 久艹日日日| 婷婷99狠狠| 东京男人天堂| 久久秀这里有精品| 久久久久久精| 99热精品青草在线| 欧美性爱精品七区| 激情亚洲天堂| 美国一区二区三区视频| 欧亚韩国999| 秋霞曰韩R级| 国产精品毛片| 日韩午夜啪啪视频| 欧美亚洲手机在线| 性感女人网页在线观看视频| 96久久精品一二三区色欲| 好舒服视频| 啪啪啪大香蕉| 青青草在线视频欧美| 操逼逼无码| 精品女人999| 啊啊啊啊,啊啊好多水| 男人天堂新| 中文字幕视频免费| 中文字幕乱在线伦视频中文字幕乱码在线 | 天天爱天天操| 猛交交| 国产91精品在线免费| 久都青青视频| 久久成人午夜精品影院| 少妇精品久久久八区九区| 日本黄 R色 成 人网站| 中文字幕一二三| 亚洲男人的天堂V| 欧美78| 91超碰人人| 超97在线精品视频| 中文熟女五十乱码在线| 夜夜高潮夜夜爽国产伦精品| 亚洲中文字幕噜噜噜久久久| 91搞逼视频| 麻豆传媒一区二区在线观看| 亚洲中文字幕网| 91亚洲欧洲| 96免费视频在线| 在线观看精品国产免费| 欧美综合狠| 欧美熟爽综合| 久久综合激情| 国产精品久久久久久 百度| 色噜噜人妻丝袜a∨先锋影| 九九亚洲视频| 国产美女口爆吞精视频| 精品无码产区一区二| 99热婷婷| 8x福利精品第一福利视频导航| 人妻少妇精品久久久| 久久性爱大全| 亚洲不卡三级手机播放| 亚洲熟妇综合久久久久久| 91大学精品激情戏| 黄色AAAAA欧美| sewuyueav| 久久综合精品一区二区三区| av一区二区三区 中文| 天堂v无码免费视频| 亚洲AV成人无码一区二区三区在线观看| 97在线免费看| 无码一区二区三区四区五区六区七区八区九区十区视频 | 国产精品久久久久9999小说| 亚洲精品九九九| 久久久蜜桃臀无码视频| 中日亚韩免费视频| 欧美色婷婷| 人妻啊啊人妻啊| 日韩精品高清资源在线| 欧美日韩免费性爱| 91综合站| 日韩少妇无码| 久草男人天堂| 久久精品中文字幕无码l| 亚洲女人91| 夜夜操一区二区| 国产在线精品偷| 99ri视频| 国产免费一区二区在线A片视频| 激情四射五月天| 日韩本不卡视频在线观看 | 91综合色| 97人人夜| 综合激情一一91| 天天看少妇| 国产热RE99久久6国产精品首| 极品综合| 91久久九九精品国产综合| 亚洲图片小说欧洲| 午夜久久久| 亚洲色图a| 婷色五月天| 欧日a| 天天躁日日躁成人字幕aⅴ| 美女91网址| 亚洲超碰97| 亚洲精品中文字幕一区在线视频 | 亚洲蜜臀精品视频久久| 欧美日韩亚洲一区二区在线观看| 久久老女人| 欧美se综合| 深夜激情| 91视频女生| 亚洲电影91| 欧美91在线+|+欧美| 欧美色图亚洲特色| 日本不卡二三区| 亚洲aw毛茸茸在线 | 97综合在线观看| 久久久久久亚洲中文| 偷拍 亚洲 欧美| 日韩中文字幕人妻视频| 欧美在线|亚洲| 亚洲性感丝袜诱惑在线观看| 99国内熟女露脸视频| 日韩精品9999| 天天日熟妇| 久久后入制服| 9美女超碰在线免费观看| 91色伦| 欧洲一区二区三区四区在线观看| 亚洲性图91| 欧美 综合 亚洲| 日本黄色天堂| 精品人妻少妇| 我想要 啊 啊 啊| 800zy一区二区| 91女网站| 国产av热热色| 91艹| 久久久久久99999国产精品| 天美麻豆黄色录像| 欧美姓爱综合网| 男人天堂东京热| 日韩精品人妻| 亚洲精品三区在线观看| 亚洲国产无码精品首页久久久| 日本网色| 亚洲男人的天堂V| 亚洲综合性网址| 中文在线视频| 丰满人妻一区二区三区四区| 岛国A V在线免费看| 超碰狠狠操| 97超碰9| 裸体美女久久久| 日韩综合97P| 色综合超碰超| 午夜亚洲国产理论秋霞| 九九热精品视频六| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 干妹子| 蜜桃AV天堂| 97欧美精品| 国产精品视频自拍在线| av凤凰久久久| 艾草av| 国偷自 一区| 中文字幕视频二区| 91丨九色丨国产丨人妻在线 | 国产一区二区三区精品观看啪| 日韩啪啪啪啪啪| 插老姨肥穴| 欧洲自拍第一页| 日韩电影在线观看网址| 亚洲精品啪视频| 92大香蕉| 黄片视频观看| 亚洲中文一区二区三区视频| 欧美欲色| 一卡二卡三卡| 无码外流操逼视频| 玖玖视频在线资源一区二区三区| 日韩天天本| 欧美色涩| 9999免费精彩视频| 亚洲少妇在线影音| 久久久精品网| 国产区性爱在线视频秋霞豆| 麻豆亚洲Av成人无码一区精品| 久草久日| 黄色人人| 操死我干死我| 亚洲丝袜少妇在线| 中国探花熟女| 日韩欧美水蜜桃人妻| 骚女天天综合网| 久久久久国产精品片区无码直播| 18岁禁 茉莉成人久久| 少妇三p| 日本天天操| 美女诱惑爱爱| 91AV国产精品| 国产毛片在线| 国产精品久久久久久久久久久久久久久久久久 | 中文字幕成人理论在线| 国产久久一区二区| 最新国内自拍av免费| 中文字幕高清20页视频| 国产精品伦理| 日本久久精品| 精品少妇人妻一区二区三区| 26UUU欧美激情一区二区| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 夜夜青青无码影院| 一区二区三区成人高清视频| 日本999精品视频| 久操免费观看| 亚洲精品色| 亚洲另类色综合网站| 草草网站影院白丝内射| 亚洲精品 欧美精品| 男女猛烈无遮掩视频免费软件| 殴美,日韩国产伦精品| 91亚洲最新在线| 国产精品亚洲免费| 日韩精品资源| 99热综合| 校园春色五月天| 五月婷婷六月天| 亚洲欧美骚| 日日干日日| 大香蕉中文在线| 色婷婷丁香五月| 欧美亚洲丝袜人妻制服中文99| 五月综合久久| 久热一区二区| 91女网站| 亚洲国产av中文字幕久久| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 亚洲中文字幕妇伦久久| 国内毛片热久久思思热| 偷拍色图| 色色色色网站| 91岛国动作片| 蜜臀精品1区2区| 日本中文字幕不卡视频| 天天舔天天日天天射| 377p欧洲日本亚洲大胆| 亚洲熟妇白浆无码AV| 天天日日夜夜| 亚洲无码com| 亚洲综合99999| 中文字幕精品一区二区精| 日韩欧美中文字| 亚洲综合婷婷| 亚洲图片另类| 亚洲AV乱码专区国产噜噜亚洲 | 免费亚洲国产精品久久一区| 秋霞影音一区二区三区| 亚洲九九视频| 91在线美女| 翔田千里爆乳巨臀无码| 欧美青青视频| 婷婷色婷婷| 五月丁香激情四射| 91国产在线精品| 97国产高清视频在线观看| AV女资源| 精品然女一区二区| 国产操偷| 麻豆精品.欧美精品.日韩精品.| 国产精品 亚洲情色| 色综合久久av| 欧美丝袜中文字幕07在线| 久久精品小视频| 日韩黄片视频试看| 国产午夜精品一区二区三区牛牛| 97 亚洲 日韩 欧美 在线| 国产野战露脸在线播放| 熟妇人妻丰满久久久久久久无码| 久久久久久亚洲精品中文字幕人妻| 久久天天艹| 日日做夜狠狠爱欧美黑人| 五月天精品| 性爱乱伦视频免费| 欧美综色欧| 夜夜騷av、一區二區| 自偷自拍的亚洲视频| 男女一进一出视频久久| 九草九九九| 欧美疯狂做爰xxxx| 欧美Aⅴ| 91bbbbbb| 欧美亚洲高清不卡| 蜜臀久久99精品久久久久久久久| 伊人五月天激情| 搡老女人老91二区| 香蕉免费一区二区三区不读 | 人人操人人射人人干| AV污污污污| 粉嫩小泬久久久一区二区| 麻豆这里只有精品| 精人妻一区二区三区| 欧美日韩色图片| 欧美日韩一区二区三区四区蜜桃| 大学生美女口爆| 欧美一二级| 人妻少妇精品一区二区三区| 屁股久久久久久久久| 成人久久久| 91老司机在线| 91激情| 天天干夜夜操一区二区| 日产国产精品中文久久婷婷| 免费一级视频特黄色大片| 日日操免费视频| 日本熟妇人妻一区二区三区| 四虎免费视频| 极品少妇99| 人人妻人人爽一区二区三区| 成熟熟女国产精品一区二区 | 综合网少妇| 亚洲日韩青青草色月| 国产久久久久久久久一区二区 | 久久久久921| 99操| 强奸乱伦动态污图免费 | 后入福利视频| 日韩 欧美 校园一区| 欧美一级二级三级| 欧美操人| 国产一区二区在线电影| 成人激情无码在线视频| 国产精品久久久久久照片| av草草在线电影| 亚洲熟女一区| 久久偷拍人| 国产黄片在线免费观看| 欧美久久伊人| 成人影院永久免费观看网址| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 无码 黑人一区二区三区| 欧美激情久操网| 欧美色宗合| 超碰97国产欧美| 啊啊啊好大好深| 一本一道久久综合久久| 蜜桃久久一区| 国产白丝AV| 嗯嗯不要 视频| 中国和日本人色哪个不下载能放| 玖玖久久久| 易易A毛视频| 69天堂| 玖草在线视频| 国产一级内射高清视频| av毛片aaaaa免费看| 欧美操人视频| 综合伊人激情| 久久精品店| 97欧美性爱| 婷婷五月天色色| 91大胆欧美| 亚洲熟妇乱女区二区三区| 欧美色图片91| 加勒比伊人综合| 91男人天堂网| 高清无码91| TS人妖另类精品视频系列| 国产在线观看一区二区三区| 亚洲 欧美 偷拍 唯美| 中国zzijzzijzzwww精品| 郑州宾馆老熟女露脸啪啪| 狠狠综合网| 97蜜桃综合| 欧美性生活内射| 国产后入式在线观看| 欧美综合自拍| 亚洲精品三区在线观看| 久久激情综合| 色播五月丁香| AV高清一区| 自拍第一页| 酒色综合网| 国产高清免费不卡av| 国产原创剧情在线丝袜| 亚洲美乱| 成年人免费观看网站| 丰满人妻一区二区三区免费 | 亚洲蜜桃V妇女| 日韩97超碰中文字幕| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 后入综合久久| 搡老熟女免费视频| 国产美女高潮| 午夜欧美J进J出白浆流出久久久| 人伦四五区| 国产成年女黄特黄| 国产成年精品高清在线观看91| 99re综合伊人| 久久成人精品| 欧美一区二区观看在线| 久久人妻四季| 婷婷五月天色网| 久久一区二区三区入口| 秋霞鲁丝午夜无码一区二区三| 91天堂| 男女真人网18| 亚洲中文字幕在现观看| 免费观看的黄色的网站| 欧美日韩情色一区二区| 欧美日韩中文字幕不卡| 超碰成人免费| 国产拍偷精品网站| 日韩精品色呦呦| 狠狠激情综合狠狠操中文字幕| a片亚洲一本通视频| 国产熟女乱论| 欧美91在线| 粉嫩av平台| 欧美精品一区二区少妇免费A片| 中日无幕一二三四区| 秋霞 色色| 四虎在线观看网站| 国产精品高潮呻吟av久久4虎| 色97干| 色婷网| 天天欧美97| …中文字幕亚洲乱,97人妻无码费视…| 日韩激情毛片一级久久久| 成人久久久| 日本一区二区三区午夜观看| 色眯眯射| 久久久久久久| 天天影视射综合网| 天天综合影院91| 久射吧| 97色碰| 亚洲欧美爆| 99久国产精品午夜性色福利| 欧美日韩欧美| 蜜臀久久99'精品久久久| 亲子敌伦对白在线播放| 精品成人无码| 2020中文字幕在线| 97色冈| 国产亚洲国产超碰| 青草草免费网站av| 亚洲第一无码播放立川理惠| 青女在线| 99热在线播放| 三级特黄60分钟播放| 午夜毛片亚洲精品片国产久久久| 婷婷五月天激情四射| 亚洲中文字幕久久无码精品| 欧美少妇一区二区三区| 97伪v| 夜夜操美女| 青青草成人视频在线观看二区| 日韩美脚一区二区网站| 天天干天天干天天| 人妻人人澡人人爽人人| 亚洲日韩美国人妻| 麻豆视频一区二区| 1024亚洲中文字幕久在线看片你懂的 | 大香蕉一人在线| 中文字幕久久婷婷丁香五月天| 九九久久久九九| 亚洲九月丁香| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 少妇的嫩逼图片| 思思热影视| 青青草日韩免费观看高清在线| 99久久久无码精品国产人| 精品少妇一区二区三区免费观看| 国产熟女无套内射| 资源在线观一 二| 精品国产乱码久久久久久蜜臀| 欧美久久九九| 大二网站亚洲| 综合网欧美在线| 色香AV| 久久人妻97久久久久久久| 岛国黄片网站| 美女91在线观看| 岛国激情视频软件| 91九色丰满高潮| 欧美日韩性爱视屏免费看了| 精品无码一区二区三区| 国产精品交换一区二区| 国产午夜福利专区综合| 亚洲情色在线| 亚洲免费人妻在| 色香AV| 动漫区日韩区欧美区| 丁香五月综合| 欧美97超碰| 久久久久久大| 亚洲熟女性高潮久久久| 91欧| 国产丰满熟夫69mpp| 激情熟女12P| 日韩中文9| 亚洲熟妇自偷自拍另欧美| 亚洲中字幕日本一区二区三区| 9精品在线| 丁香五月天激情网站| 好属操| 五十路熟女工口 | 在线v中文字幕一区二区三区| 亚洲毛片基地专区| 熟妇艹鸡八| 波多野结衣被操50分钟免费视频 | 国产精品嫩草久久久久| 亚洲美女精品九九视频| 天美传媒在线一区| 婷婷啪啪| 逼逼逼逼操操操操操操操操操午夜剧场 | 日本三级韩国三级美三级91| 色婷婷99| 中文字幕日韩人妻视频一区二区三区| 久9九综合在线| 久久一二三四不卡| 91久久精品蜜臀| 天天色天天干天天射| 亚洲精品久久久久久久蜜桃臀| 欧亚成人在线视频| 91操操| 国产专区路线| 日韩中文字幕视频在线观看| 国产v片在线免费观看| 爱丝福利| 久久精9| 97天天爽| 国产热RE99久久6国产精品首| 国产粉嫩蜜臀av一区二区三区| 骚货 中文字幕 av| 少妇三P| 另类小说五月天| 亚洲中文一区二区三区| 欧州一区二区三区四区| 欧美成人精品欧美一级乱黄一区二… | 国产亚热在线久久| 亚洲视频一二区| 亚洲宅男天堂| 日韩无码专区| 欧美日韩国内不卡| 欧美另类综合久久| 伦激情人妻另类人妻| 另类图片综合| 综合网 欧美| 丰满欧美放荡少妇在线| 91性生活久久久| 骚乳在线| 亚洲aV性爱| 91天天| 国产91 丝袜在线播放00-百度| 久久精品无码不卡| 久久久久久波多野吉衣高潮| 怡红院视频在线| 激情五月天婷婷| www黄片免费看com| 2017人人操,人人摸| 东京热男人的天堂| 天天综合网91| 久久久96| 性色A∨91| 91中出视频| 99re视频在线播放青草| 男人的天堂com| 国产日韩在线播放av| AV网站高清无码在线观看| PMv在线观看| 在线观看 99热| 日韩久久.一级黄色片| 三级日本一区二区三区| AAAA欧美日韩| 久久久啊啊啊| 亚洲精品九九九九九九| 亚州黄站| 亚洲熟女av中文字幕| 成人性交午夜免费片| 久久超碰天天| 蜜臀av在线播放一区二区三区| 欧美啪啪色吧在线| 久久熟女精品不卡一区| 国产三级多多影院2022国产AA一级毛片无码 | 欧美黄业| 丁香婷婷色五月| 久久久九九| 伊人AAA| 九九热超碰97亚洲最新香蕉| 日韩视频啪啪| 屁股久久久久久久| av72网| 日本在线不卡一二区| 偷拍片久久| 女人喷水视频在线观看| 一区二区视频在看| 伊人宅男大香蕉| 激情小说亚洲| 777超碰| 亚洲精品一二三四区| 操逼网站地址| 国产三级多多影院2022国产AA一级毛片无码| 亚洲 无码 偷拍| 亚州综| 青青欧美| 亚州色站 日韩电影| 综合色图亚洲欧美| 久久精品国产亚洲AV成人直播| 无遮挡一级毛片视频免费的| 国产无马在线| 国产精品久久| 91宗合网| 久久 国产 无码| 久久这里是精品| 精品国产乱码久久久久久口爆网站| 999岛国大片| 久久久成人国产精品无码| 日本岛国黄色网址| 人人爱夜夜爱| 国内成人圈中文字幕无码视频| 中文字幕av丝袜| 97超碰公开| 极品销魂美女一区二区| 91小视频| 99自拍视频在线观看| 蜜臀精品1区2区| 无卡一区=区| 九九AV| a片自拍直播视频| 韩三级a视频在线观看| 乱伦熟女区| 欧美黄色图片| 无码精品啪啪啪一区二区三区三州| 久久久日本电影| 香蕉久久AⅤ...| 久久天天艹| 激情婷婷五月天| 久久久久久久久久黄色网| 国语精品对白| 第四色奇米影视777| 97人人草| 麻豆精品天美| 综合欧美亚洲| 欧美日韩色综合网| 极品色社| 中文欧丝袜诱惑| 亚洲影院成人| 在线视频日韩欧美国产| 超碰97色色| 中文有码9| 国产精品无码久久久久2025| 射 色综合| 青青草在线视频播放器| 久久久一区二区三区四区五区| 怡红院亚洲怡春院av| 午夜啪| 日韩在线性爱免费视频| 五月婷婷基地| 青青草男人天堂| 青青草一区二区高清无码视频| 国产成年女人免费视频播放a| 99精品网| 我想要 啊 啊 啊| 超97在线精品视频| 天天干天天日天天射黄色大片| 国产精品3| www熟女乱伦com| 免费观看欧美日韩操逼视频| 午夜毛片高清免费不卡| a片在线播放| 丁香五月婷婷色| 91欧美性| 隔壁邻居波多野结衣中文字幕 | 伊人久久大香线蕉无码| 精品人妻一区二区三区-国产| 精品久操| 国产黄色视频久久| www.夜夜| 少妇精品久久久八区九区| 2020中文在线一区二区三区| 亚洲熟妇乱女区二区三区| 欧美性爱伊人| 日日日大屁股骚女人精品| 人妻精品视频一区二区| 999岛国大片| 精品免费囯产一区二区三区 | 久久精品国产亚洲AV无码电影| 国产无马av| 国产丝袜一区二区三区| 天天日天天爽| 加勒比久久av| 老熟妇一区二区三区…| 天天淫人人妻日日色| 亚洲图片欧美| 日韩探花精品在线视频| 深爱五月婷婷| 男人天堂久久日韩| 最新亚洲黄色免费电影 | 女性喷水高潮在线观看| 手机在线人成免费视频| 亚洲第91页 | 综合av影片| 97国产精品久久久久| 精品在线观看视频在线| 校园春色宗合网| 欧美精品自慰系列寂寞少妇| 天天天堂影视日韩亚洲91| 国产原创自拍| 美女91在线| 人妻酒店出差被中出免费在线播放| 欧美草草| 丝袜AV一区二区三区| 精品久久青青草| 亚洲久久久久| 97人妻色| 亚洲色婷婷久久91| 成人A片男人的天堂| se01国产在线视频| 久久久久78| 国产精品另类一区大香蕉| 久久最新视频免费观看| www.91理论| 狠狠中文字幕| 性欧美| 人人摸人人干| 麻豆熟妇乱妇熟色A片在线看| 手机看av网站在线看| chaopen97久久| 91亚洲影院综合| 色y情视频免费看| 国产女s强制榨精视频| 久久精品久久九九精品| 亚洲va有码在线天堂| 久久久久久久国产a∨| 亚洲成A∨人影院在线欢看| 色999;丁香五月| 婷婷99| www老逼91| 国产欧美精品日韩区二区麻豆天美| 蜜臀少妇一区二区| 夜夜操夜夜爽夜夜高潮| 热热热热日日漂亮永久永久国产日| 91在线丝袜| 一级一性爱免费视频| AV不卡在线| 97色欧洲| 久操影视| 超碰超碰95| 亚洲Av无码成人精品国产| 国产激情视频一区区三区| av网站免费线看| 欧美日韩岛国大片在线观看| 操比国产| 婷婷色香| 天天综合站| 日韩三级伊人| 中国一区二区亚洲人妻| 91九九九馒头| 久久久少妇诱惑精品视频| 国内精品久久人妻性色av| 十八禁视频网站| 1区2区3区中文字幕日韩| 72av视频| 亚洲国产成人高清在线| 91 国产丝袜在线放观看| 欧美 日韩第一性色| 97超碰美国| 强奸乱伦大香蕉网| 午夜福利成人免费视频| 国模限制级电影| 夜夜做夜夜爽精品视频| 日韩无限资源| 麻豆视频国产一区二区| 久久首页| 草蕉影视亚洲无码| q2午夜理论片夜色av| 97视频620| 天堂在线一区二区| 色爱亚洲| 大香蕉伊人75| 国产精品视频在线观看| 色色青青久久| 国产成人欧美精品在线| 欧美日韩国产高清在线一二三区 | 五月丁香影院| 91n处女在线观看| 亚州色图片在线色| 亚洲一本色码中文字幕| 香蕉大久久久| 五月天AV资源| 午夜性生活av免费在线看| 色色激情五月天| laoshunv91| 欧美日韩电影成人在线| 狠狠躁AV| 亚洲精品97p| 精品中文字幕一区二区l - 百度| 久久av网| 91色伦综合| 亚洲色天堂九9| 激情天天视频| 无码操逼网| 东北夫妻性偷拍| 狠狠躁天天躁日日躁| 婷婷操视频| 欧美成人午夜免费福利785| 久久久久久久久久久999| 一区二区三区免费视频入口| 91无码中出人妻视频| 久久久999国产| 丁香婷婷大香蕉| 91性情| 精品人妻美妇91job| 97超碰资源网| 岛国色情视频在线观看| 大香蕉综合在线| 日韩无码人妻中字久久三区四区| 国产精品亚洲免费| 亚洲欧美碰碰| 天美传媒国产原创中文字幕亚洲欧美另类 | 亚洲大色堂| 欧美性爱第一区| 精品欧美日韩在线观看| 国产精品久久久吖| 长久操视频| 亚洲成人在线播放| 亚洲无线码欧洲精品区别| 久久同城AV| 天天干美少妇一区| 亚洲伊人a线观看视频| 夜夜操中文字幕| 精品女人999| 芊芊操逼视频无码| 欧美日韩亚洲天堂| 妇人噜噜| 超碰97欧美在线| 久久东京伊人一本到鬼色| 久久m| 情侣开房子拍 日韩无码 女的很漂亮| 色哟哟AⅤ| 色婷婷日韩精品一区二区三区| 日韩美女久久一区二区三区| 国产亚洲日韩在线三区黑人| 婷婷激情四射| 67914亚洲精品| 久久AV无码网址| 亚洲精品一二牛牛| 99爱爱| 国产农村妇女一区二区| 成人三一级一片aaa| 国产成人在线观看网址| 久久婷婷亚洲欧| 超碰久久性爱| 五月丁香激情啪啪| 亚洲第一无码播放立川理惠| 一区二区三区免费视频入口| 九九九九亚洲| 男人的天堂久久| 毛片99-全集电影手机免费观看完整-B029AV | 国产操逼视频在线观看| 91少妇| 国产精品999aaa| 久久久女人| 久草成人影片| 97欧美久久久久久久| 欧美色自拍| 色香伊人| 九九热AV| 日韩人妻精品久久久久| 97中文超碰| 一区二区娱乐网站| 国产精品自在线发布| 操逼网站视频漫画国产| 日日干天天干夜夜爽| 久久久久久亚洲Av无码精| 插入逼91| 再深点灬舒服灬太大了添视频| 久久久九九九| 秋霞一级鲁丝片A片| 久草午夜| 亚洲欧美日韩激情不卡| 少妇无码999| 97中文字幕一区| 精品久久97| 国产日韩精品suv| 大香蕉视频一二三区| 青青操综合网| 欧美黄片视频在线观看免费| 色婷婷香蕉| 欧美极品少妇交| 日韩ab网| 死我十八禁| 中文乱码字幕观看| 无码操逼视频一下| 大伊香蕉在线视频免费| 99在线精品视频| 欧美乱妇狂野欧美在线视频| 久久久久久久综合,国产| 另类小说欧美激情校园春色| 在线视频97| 3D污黄视频在线观看| 91人妻人人妻| 久久亚洲天堂| 五月亭亭六月丁香| 天天天天天天天天天天干美女| 九九九九久久久| 97精品国产精品免费观看| 亚洲精品尤物yw在线影院| 开心五月深爱五月| 18一区二区三区| 91九九九小逼| 亚洲超碰97| 长长久久免费视频| 日韩中文9| 91一区二匹| 丁香婷婷九月| 极品粉嫩一区二区| 久久啊啊| 日韩乱插| av线电影| 亚洲国产欧美一区二区潘金莲| 五月婷婷激情| 欧美韩日精品资源| 中文字幕三四五区| 亚洲男人的天堂亚洲| 91色夜| 亚洲色图尤物视频| 精品国产嫩穴视频| 狠狠色五月亚洲91| 91三级理论片播放器| 久日91在线| 人人看人人插| 日韩av色图综合|