亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

排隊(duì)叫號系統(tǒng)源碼解析:Socket通信與SQL Server事務(wù)實(shí)踐

排隊(duì)叫號系統(tǒng)源碼解析:Socket通信與SQL Server事務(wù)實(shí)踐 簡介面向C#初學(xué)者和排隊(duì)機(jī)系統(tǒng)設(shè)計(jì)者這份源代碼完整呈現(xiàn)了一套可實(shí)際投產(chǎn)的排隊(duì)叫號系統(tǒng)。系統(tǒng)覆蓋取號、呼叫、窗口分配、候診屏同步顯示等核心業(yè)務(wù)流程并封裝了數(shù)據(jù)庫操作輔助類與常見硬件設(shè)備對接邏輯可幫助讀者理解工業(yè)級叫號項(xiàng)目的整體架構(gòu)與實(shí)現(xiàn)思路。項(xiàng)目已在真實(shí)客戶現(xiàn)場穩(wěn)定運(yùn)行多年整體代碼幾乎無保留界面與業(yè)務(wù)規(guī)則均可自行修改擴(kuò)展尤其適合正在為排隊(duì)機(jī)方案發(fā)愁的開發(fā)者做參考。壓縮包為rar格式共249個(gè)文件大小僅1.29MB其中以172個(gè)C#源碼文件為主另有44個(gè)resx資源文件、9個(gè)項(xiàng)目工程文件、2個(gè)rdlc報(bào)表文件以及設(shè)置、圖標(biāo)、用戶控件等輔助文件模塊劃分清晰便于按功能分段研讀與二次開發(fā)。目前已有1617人學(xué)習(xí)下載對希望快速上手WinForm數(shù)據(jù)庫開發(fā)、或需要完整叫號系統(tǒng)設(shè)計(jì)樣例的讀者而言這份穩(wěn)定可靠的實(shí)戰(zhàn)代碼能節(jié)省大量從零搭建的時(shí)間。1. 排隊(duì)機(jī)叫號一個(gè)把大廳廣播、小票打印和數(shù)據(jù)庫串起來的實(shí)時(shí)隊(duì)列系統(tǒng)在醫(yī)院分診臺取號小票打出來消化內(nèi)科 A012 前面還有 5 人到銀行網(wǎng)點(diǎn)拿身份證一刷柜臺呼叫下一位大屏同步閃出號碼和窗口號。這套熟悉得不能再熟悉的流程背后就是一個(gè)獨(dú)立的排隊(duì)機(jī)叫號系統(tǒng)。這份源碼不是某個(gè)大廠中間件而是一套完整的 C/S 架構(gòu)工程覆蓋了取號、叫號、過號、重呼、窗口分配、大屏展示、語音播報(bào)、業(yè)務(wù)量統(tǒng)計(jì)這些叫號系統(tǒng)該有的全部環(huán)節(jié)。適合三類人接政企外包需要做叫號交付的開發(fā)者、想在自己的業(yè)務(wù)系統(tǒng)里集成排隊(duì)模塊的技術(shù)負(fù)責(zé)人、以及正在學(xué) Socket 通信和 SQL Server 事務(wù)開發(fā)的初學(xué)者。技術(shù)選型偏傳統(tǒng)但架構(gòu)干凈核心就一條 TCP 消息鏈路加一張不斷變狀態(tài)的排隊(duì)表值得拆開看一遍。2. 系統(tǒng)拆解四端一中心一個(gè) TCP 消息把大廳串起來2.1 整體架構(gòu)排隊(duì)叫號本質(zhì)上是一個(gè)狀態(tài)機(jī)被消息推著走很多人第一次接觸叫號系統(tǒng)會以為難點(diǎn)在大屏 UI 或者語音播報(bào)其實(shí)拆開源碼看核心就是三個(gè)角色之間的消息流轉(zhuǎn)取號端負(fù)責(zé)發(fā)號窗口端負(fù)責(zé)叫號大屏端負(fù)責(zé)展示和播報(bào)而服務(wù)端是唯一能碰數(shù)據(jù)庫的角色。整個(gè)系統(tǒng)采用 Socket 長連接組網(wǎng)服務(wù)端作為消息中心四個(gè)程序通過網(wǎng)絡(luò)連接在一起。顧客在取號機(jī)上按下個(gè)人業(yè)務(wù)取號端把請求發(fā)給服務(wù)端服務(wù)端寫庫生成號碼再返回給取號端打印小票柜員在窗口端點(diǎn)呼叫下一個(gè)窗口端把指令發(fā)給服務(wù)端服務(wù)端更新數(shù)據(jù)庫里的排隊(duì)狀態(tài)然后主動(dòng)把叫號通知推給大屏端和語音端。數(shù)據(jù)庫在這一整套流程里只跟服務(wù)端打交道其他三個(gè)端都不直接讀寫數(shù)據(jù)庫。這種服務(wù)端收口數(shù)據(jù)庫的設(shè)計(jì)好處很明顯排隊(duì)狀態(tài)的任何變化都有唯一的數(shù)據(jù)入口不會出現(xiàn)窗口端和大屏端各改各的導(dǎo)致數(shù)據(jù)不一致。缺點(diǎn)是服務(wù)端一旦掛了整個(gè)大廳叫號就癱掉所以源碼里服務(wù)端也做了一些斷線重連和恢復(fù)處理后面的避坑章節(jié)會細(xì)說。2.2 工程目錄一次下載下來你會看到的項(xiàng)目結(jié)構(gòu)源碼解決方案是標(biāo)準(zhǔn)的 Visual Studio 結(jié)構(gòu)五個(gè)工程按職責(zé)切分得比較清楚QueueSystem/ ├── QueueServer.Svc/ 服務(wù)端程序含狀態(tài)機(jī)核心邏輯 │ ├── Core/ 隊(duì)列調(diào)度、過號掃描、恢復(fù)邏輯 │ ├── DB/ SQL Server 數(shù)據(jù)訪問層 │ └── SocketService/ TCP 監(jiān)聽、消息解析、客戶端會話管理 ├── QueueClient.Terminal/ 取號端程序觸摸屏取號機(jī)界面 ├── QueueClient.Window/ 窗口端程序柜員叫號操作界面 ├── QueueClient.Screen/ 大屏端程序LCD/LED 展示與語音播報(bào) ├── Queue.Common/ 公共類庫消息協(xié)議封裝、實(shí)體模型、日志組件 ├── DbScript/ │ └── QueueDB.sql 數(shù)據(jù)庫初始化腳本建庫建表基礎(chǔ)數(shù)據(jù) └── QueueSystem.sln服務(wù)端工程里最重要的目錄是Core和SocketService一個(gè)管隊(duì)列怎么排隊(duì)一個(gè)管消息怎么收發(fā)。Queue.Common是所有工程都引用的公共類庫消息幀的封包拆包、實(shí)體對象的序列化都在這。四個(gè)端共享同一套協(xié)議類這是通信不跑偏的基礎(chǔ)。每個(gè)客戶端工程里都有對應(yīng)的app.config或ApplicationConfig.config大屏端和窗口端配置服務(wù)端 IP 和端口取號端還可以額外配置小票打印機(jī)串口號。這套命名和結(jié)構(gòu)對做過 C/S 項(xiàng)目的人來說基本零門檻按圖索驥能找到所有入口。2.3 消息協(xié)議設(shè)計(jì)一條命令字 長度 JSON的幀協(xié)議四端之間傳的不是 XML 也不是對象流而是一種非常樸素的自定義文本協(xié)議消息幀格式是命令字|消息體長度|消息體消息體是一段 JSON 字符串。比如服務(wù)端向大屏推一條叫號通知實(shí)際在網(wǎng)絡(luò)上傳輸?shù)膬?nèi)容是這樣SVR_CALL_NOTIFY|112|{QueueNO:A012,WindowNO:03,CallTime:2024-06-25 09:30:12}幀里的三個(gè)字段用豎線分割命令字標(biāo)識消息類型長度告訴接收方要讀滿多少字節(jié)才算一條完整消息JSON 承載具體業(yè)務(wù)數(shù)據(jù)。長度字段很關(guān)鍵因?yàn)?TCP 是流式傳輸接收方如果不按長度去湊夠一條消息就會出現(xiàn)一次 Read 拿到半條消息或者兩條消息粘在一起的情況。Queue.Common里對應(yīng)的封包拆包邏輯是這個(gè)樣子/// summary把一個(gè)命令字和消息體打包成一幀網(wǎng)絡(luò)消息/summary public static byte[] Pack(string cmd, object body) { // 把消息體序列化為 JSON 字符串 string json JsonConvert.SerializeObject(body); // 拼接成 命令字|長度|消息體 的幀格式 string frame ${cmd}|{json.Length}|{json}; // 轉(zhuǎn)成 UTF-8 字節(jié)返回給 Socket 發(fā)送 return Encoding.UTF8.GetBytes(frame); } /// summary從接收緩沖區(qū)里拆出一條完整的消息返回命令字和反序列化后的原始 JSON/summary public static bool TryParse(byte[] buffer, ref int offset, out string cmd, out string json) { cmd null; json null; // 先把緩沖區(qū)轉(zhuǎn)成字符串找第一個(gè)豎線分隔符截出命令字 string text Encoding.UTF8.GetString(buffer, offset, buffer.Length - offset); int firstSep text.IndexOf(|); if (firstSep 0) return false; cmd text.Substring(0, firstSep); // 再截出長度字段用 int.TryParse 解析出消息體應(yīng)該有多少個(gè)字符 int secondSep text.IndexOf(|, firstSep 1); int length int.Parse(text.Substring(firstSep 1, secondSep - firstSep - 1)); // 如果緩沖區(qū)里剩余字節(jié)數(shù)比消息體長度還少說明消息還沒收全返回 false if (text.Length - secondSep - 1 length) return false; // 按長度字段截出完整 JSON 消息體并更新偏移量 json text.Substring(secondSep 1, length); offset secondSep 1 length; return true; }這里的邏輯說明要展開兩點(diǎn)第一Pack里把 JSON 序列化和幀拼接做了合并調(diào)用方只傳命令字和業(yè)務(wù)對象不用關(guān)心轉(zhuǎn)義問題第二TryParse是增量解析服務(wù)端每個(gè) Socket 會話都持有一個(gè)緩沖區(qū)收到新數(shù)據(jù)就丟進(jìn)這個(gè)解析器能拆出完整消息才進(jìn)入業(yè)務(wù)分發(fā)。判斷消息沒收全的那個(gè)分支最容易寫錯(cuò)長度字段必須按 JSON 字符串的字符數(shù)計(jì)算如果按Encoding.UTF8.GetBytes(json).Length算字節(jié)數(shù)遇到中文就全亂套了這也是這份源碼里一個(gè)隱藏的易錯(cuò)點(diǎn)。命令字在Queue.Common里定義成了常量類稍大一點(diǎn)的系統(tǒng)建議改成枚舉但源碼用字符串常量也沒問題。常用的命令字有TERM_TAKE_NUMBER取號、WIN_CALL_NEXT叫下一位、WIN_FINISH辦結(jié)、SVR_CALL_NOTIFY叫號廣播、SVR_SCREEN_SNAP大屏隊(duì)列快照和HBT_HEARTBEAT心跳。3. 數(shù)據(jù)庫設(shè)計(jì)排隊(duì)表里的每一條記錄都在等狀態(tài)變化3.1 四張核心表隊(duì)列、窗口、業(yè)務(wù)類型和操作日志打開DbScript/QueueDB.sql往后面翻會發(fā)現(xiàn)整個(gè)排隊(duì)的業(yè)務(wù)數(shù)據(jù)落在四張表上T_BusinessType存業(yè)務(wù)類型個(gè)人業(yè)務(wù)、對公業(yè)務(wù)、掛失銷戶T_WindowInfo存窗口基礎(chǔ)信息T_QueueInfo是排隊(duì)明細(xì)主表T_QueueLog記錄每一次操作軌跡。其中T_QueueInfo.Status字段是整個(gè)系統(tǒng)的靈魂它用四個(gè)數(shù)字表示一條排隊(duì)記錄的完整生命周期-- 排隊(duì)明細(xì)主表一條記錄代表一張排隊(duì)小票 CREATE TABLE T_QueueInfo ( Id INT IDENTITY(1,1) PRIMARY KEY, -- 自增主鍵 QueueNO VARCHAR(10) NOT NULL, -- 叫號號碼例如 A012 TokenNO VARCHAR(20) NOT NULL, -- 小票流水號用于取票憑證和追溯 BusinessTypeId INT NOT NULL, -- 關(guān)聯(lián)業(yè)務(wù)類型表 WindowId INT NULL, -- 當(dāng)前服務(wù)的窗口ID未叫號時(shí)為NULL Status TINYINT NOT NULL DEFAULT 0, -- 0等待中 1已叫號 2已過號 3已完成 4已取消 CreateTime DATETIME NOT NULL DEFAULT GETDATE(), -- 取號時(shí)間 CallTime DATETIME NULL, -- 首次叫號時(shí)間過號判斷依賴這個(gè)字段 FinishTime DATETIME NULL, -- 辦結(jié)或取消時(shí)間 SourceType TINYINT NOT NULL DEFAULT 0 -- 0現(xiàn)場取號 1預(yù)約簽到擴(kuò)展用 );這張表的狀態(tài)流轉(zhuǎn)可以直觀理解為取號插入一條Status0的等待記錄窗口叫號把0改成1并寫入CallTime顧客超時(shí)未到則變成2辦結(jié)改成3。QueueNO里的字母前綴來自業(yè)務(wù)類型表的Prefix字段比如 A 開頭的個(gè)人業(yè)務(wù)和 B 開頭的對公業(yè)務(wù)同類業(yè)務(wù)內(nèi)部按三位流水號遞增。T_BusinessType除了存業(yè)務(wù)名稱和前綴還有一個(gè)IsPriority字段表示這個(gè)業(yè)務(wù)類型是否允許優(yōu)先叫號。T_QueueLog則簡單記錄操作的流水誰在什么時(shí)間對哪條隊(duì)列做了什么操作用于事后排查這個(gè)號到底被誰叫過。數(shù)據(jù)模型整體說不上精巧但非常符合叫號業(yè)務(wù)的實(shí)際運(yùn)營邏輯。3.2 取號一個(gè)串行化事務(wù)完成號碼生成取號動(dòng)作的最終落點(diǎn)其實(shí)就是一段查詢最大序號 1再插一條記錄的代碼。但就是這么簡單的邏輯并發(fā)做不好就會出現(xiàn)兩個(gè)顧客取到相同號碼。服務(wù)端Core/TakeNumberHandler.cs里的實(shí)現(xiàn)用了Serializable隔離級別的事務(wù)把取最大值和插入記錄兩件事鎖在同一條鏈路上執(zhí)行/// summary取號核心邏輯生成排隊(duì)號碼并寫入數(shù)據(jù)庫/summary public TicketResult TakeNumber(int businessTypeId) { using (SqlConnection conn DB.CreateConnection()) using (SqlTransaction tx conn.BeginTransaction(IsolationLevel.Serializable)) { // 在事務(wù)內(nèi)查詢該業(yè)務(wù)類型當(dāng)天已存在的最大序號 // 加上 UPDLOCK讓兩個(gè)并發(fā)取號請求在這里排隊(duì)等待而不是同時(shí)讀到同一個(gè)值 SqlCommand cmd new SqlCommand( SELECT ISNULL(MAX(Seq), 0) AS MaxSeq FROM T_QueueInfo WITH (UPDLOCK) WHERE BusinessTypeId bt AND CreateTime today, conn, tx); cmd.Parameters.AddWithValue(bt, businessTypeId); cmd.Parameters.AddWithValue(today, DateTime.Today); int maxSeq (int)cmd.ExecuteScalar(); int newSeq maxSeq 1; // 組合叫號號碼業(yè)務(wù)前綴 三位流水號例如 A012 string prefix GetPrefix(businessTypeId); string queueNo ${prefix}{newSeq:D3}; // 小票流水號用時(shí)間戳生成精確到毫秒用于后續(xù)追溯和預(yù)約核銷 string tokenNo DateTime.Now.ToString(yyyyMMddHHmmssfff); // 插入排隊(duì)記錄Status 默認(rèn) 0 表示等待中 SqlCommand ins new SqlCommand( INSERT INTO T_QueueInfo(QueueNO, TokenNO, BusinessTypeId, Status, CreateTime) VALUES(qno, tno, bt, 0, now), conn, tx); ins.Parameters.AddWithValue(qno, queueNo); ins.Parameters.AddWithValue(tno, tokenNo); ins.Parameters.AddWithValue(bt, businessTypeId); ins.Parameters.AddWithValue(now, DateTime.Now); ins.ExecuteNonQuery(); tx.Commit(); // 返回號碼和當(dāng)前等待人數(shù)給取號端小票打印使用 return new TicketResult(queueNo, GetWaitCount(businessTypeId)); } }這段代碼里有兩個(gè)值得抄走的細(xì)節(jié)。第一個(gè)是WITH (UPDLOCK)它讓并發(fā)取號的多個(gè)事務(wù)在MAX(Seq)查詢處排隊(duì)避免兩個(gè)請求同時(shí)讀到同一個(gè)maxSeq后各自 1 導(dǎo)致號碼重復(fù)。第二個(gè)是CreateTime today這個(gè)條件它保證了流水號只按當(dāng)天累計(jì)第二天取號會重新從 1 開始編號這是叫號業(yè)務(wù)里默認(rèn)的業(yè)務(wù)規(guī)則。GetWaitCount在事務(wù)內(nèi)部執(zhí)行也很重要它查詢當(dāng)前還在等待中的記錄數(shù)這個(gè)數(shù)字會打印在小票上告訴顧客前面還有 X 人。如果把它放到事務(wù)外面取號剛結(jié)束還沒提交事務(wù)時(shí)等待人數(shù)就會少算自己這一個(gè)雖然差別不大但總歸是數(shù)據(jù)一致性問題。3.3 叫號、過號與重呼狀態(tài)機(jī)是怎么轉(zhuǎn)起來的窗口端按下呼叫下一個(gè)服務(wù)端干的活本質(zhì)上是把隊(duì)列里最早一條Status0的記錄改成1然后廣播給大屏。源碼里CallNext的實(shí)現(xiàn)沒有用復(fù)雜的存儲過程而是靠SELECT UPDLOCK先把候選行鎖住再更新/// summary窗口叫號從等待隊(duì)列里取出最早的一條記錄更新狀態(tài)并推送給大屏/summary public CallResult CallNext(int windowId, int businessTypeId) { string queueNo null; using (SqlConnection conn DB.CreateConnection()) using (SqlTransaction tx conn.BeginTransaction()) { // 鎖定最早一條等待中的記錄READPAST 讓并發(fā)的叫號請求直接跳過被鎖的行避免互相阻塞 SqlCommand select new SqlCommand( SELECT TOP 1 QueueNO FROM T_QueueInfo WITH (UPDLOCK, READPAST) WHERE Status 0 AND BusinessTypeId bt ORDER BY CreateTime, conn, tx); select.Parameters.AddWithValue(bt, businessTypeId); queueNo select.ExecuteScalar() as string; if (queueNo null) { tx.Rollback(); return new CallResult { Success false, Message 當(dāng)前無等待號碼 }; } // 把這條記錄狀態(tài)置為“已叫號”并登記窗口和叫號時(shí)間 SqlCommand update new SqlCommand( UPDATE T_QueueInfo SET Status 1, WindowId win, CallTime now WHERE QueueNO qno AND Status 0, conn, tx); update.Parameters.AddWithValue(win, windowId); update.Parameters.AddWithValue(qno, queueNo); update.Parameters.AddWithValue(now, DateTime.Now); update.ExecuteNonQuery(); tx.Commit(); } // 通知大屏端和語音端顯示叫號信息這一步必須放在事務(wù)提交之后 ScreenBus.Broadcast(SVR_CALL_NOTIFY, new { QueueNO queueNo, WindowNO GetWindowNo(windowId) }); return new CallResult { Success true, QueueNo queueNo }; }對READPAST這個(gè)提示需要多做一句說明多個(gè)窗口同時(shí)按呼叫下一個(gè)時(shí)第一個(gè)事務(wù)鎖住了TOP 1的記錄第二個(gè)叫號事務(wù)如果不加READPAST就會一直等第一個(gè)事務(wù)提交才能繼續(xù)掃描導(dǎo)致窗口 2 的叫號按鈕轉(zhuǎn)圈。加了這個(gè)提示后第二個(gè)事務(wù)直接跳過被鎖住的行去取下一條等待記錄兩個(gè)窗口可以同時(shí)各叫各的號互不干擾。這是多窗口叫號場景下最容易忽略的一個(gè)病根。過號邏輯則是掛在服務(wù)端的一個(gè)后臺定時(shí)器上每隔 30 秒掃一次把已經(jīng)叫號但超過 3 分鐘沒來柜臺辦理的號碼置為2已過號并同步推一條消息給大屏讓它從正在叫號區(qū)域移除-- 過號掃描把叫號后超過 OverTime 秒仍未辦理的號碼置為過號狀態(tài) UPDATE T_QueueInfo SET Status 2 WHERE Status 1 AND DATEDIFF(SECOND, CallTime, GETDATE()) 180重呼的邏輯則簡單得多窗口端對一條Status2的過號記錄點(diǎn)重呼服務(wù)端把它從2改回1并重新廣播一次叫號通知。狀態(tài)機(jī)總共就四條邊等待到叫號、叫號到完成、叫號到過號、過號到重呼回叫號理解這四條邊就能看懂整個(gè)系統(tǒng)的流轉(zhuǎn)邏輯。4. 部署運(yùn)行從建庫到聽到第一聲叫號4.1 初始化數(shù)據(jù)庫一條命令把庫建好把源碼拉到本地后第一步不是開 Visual Studio 編譯而是先把數(shù)據(jù)庫準(zhǔn)備好。打開DbScript目錄下的QueueDB.sql里面已經(jīng)寫好了建庫、建表、插入基礎(chǔ)業(yè)務(wù)類型和窗口數(shù)據(jù)的完整腳本。用 SQL Server Management Studio 連上本地?cái)?shù)據(jù)庫實(shí)例直接執(zhí)行這個(gè)腳本即可腳本末尾會插入常見的業(yè)務(wù)類型數(shù)據(jù)和 1 到 8 號窗口數(shù)據(jù)。需要注意的是腳本使用的 SQL 語法只依賴基礎(chǔ)功能2008 R2 及以上版本的 SQL Server 都能跑。執(zhí)行完成后可以驗(yàn)證一下四張表是否都建出來了-- 檢查核心表是否創(chuàng)建成功 SELECT name FROM sys.tables WHERE name IN (T_BusinessType,T_WindowInfo,T_QueueInfo,T_QueueLog);成功后T_BusinessType里應(yīng)該能看到個(gè)人業(yè)務(wù) A、對公業(yè)務(wù) B兩條初始數(shù)據(jù)。如果想改業(yè)務(wù)名稱或加前綴直接在這里改就行但注意前綴長度最好保持 1 個(gè)字母否則QueueNO的字段長度需要相應(yīng)調(diào)整。4.2 配置文件與啟動(dòng)順序數(shù)據(jù)庫就緒后按順序配置四個(gè)程序的連接信息。服務(wù)端的app.config里有兩個(gè)關(guān)鍵配置段connectionStrings里的QueueDB連接字符串以及appSettings里的監(jiān)聽端口和過號時(shí)間configuration connectionStrings !-- 換成實(shí)際部署環(huán)境的數(shù)據(jù)庫地址、賬號密碼 -- add nameQueueDB connectionStringServer127.0.0.1;DatabaseQueueSys;User Idsa;Password123456;Poolingtrue;Min Pool Size5/ /connectionStrings appSettings !-- TCP 監(jiān)聽端口所有客戶端都通過這個(gè)端口連接服務(wù)端 -- add keyListenPort value9100 / !-- 過號超時(shí)時(shí)間單位秒超過這個(gè)時(shí)間未辦理自動(dòng)置為過號 -- add keyOverTime value180 / /appSettings /configuration大屏端、窗口端、取號端的配置則簡單很多只需要告訴程序服務(wù)端在哪appSettings !-- 服務(wù)端所在機(jī)器的 IP局域網(wǎng)部署時(shí)填服務(wù)端電腦的內(nèi)網(wǎng)地址 -- add keyServerIP value127.0.0.1 / add keyServerPort value9100 / !-- 窗口端專屬配置標(biāo)識當(dāng)前程序是幾號窗口 -- add keyWindowId value1 / add keyWindowName value綜合窗口1號 / /appSettings啟動(dòng)順序有講究先啟動(dòng)服務(wù)端再啟動(dòng)大屏端和窗口端最后啟動(dòng)取號端。服務(wù)端啟動(dòng)后監(jiān)聽 9100 端口各客戶端啟動(dòng)時(shí)會發(fā)起 Socket 連接并注冊自己的身份。窗口端啟動(dòng)時(shí)會自動(dòng)把窗口狀態(tài)置為空閑大屏端啟動(dòng)后會向服務(wù)端索要一次當(dāng)前隊(duì)列快照把已經(jīng)叫號但還沒辦結(jié)的號碼恢復(fù)到屏幕上顯示出來。如果反過來先啟動(dòng)客戶端再啟動(dòng)服務(wù)端客戶端會進(jìn)入斷線重試狀態(tài)每 3 秒嘗試重連一次倒也能自動(dòng)恢復(fù)。4.3 驗(yàn)收流程模擬一次完整的取號叫號全部啟動(dòng)完成后可以用一個(gè)最簡單的方式驗(yàn)證整個(gè)系統(tǒng)是否跑通手動(dòng)造一條取號請求。如果沒有實(shí)體取號機(jī)和小票打印機(jī)可以直接打開取號端程序界面上會顯示業(yè)務(wù)類型按鈕點(diǎn)擊個(gè)人業(yè)務(wù)按鈕程序會向服務(wù)端發(fā)送TERM_TAKE_NUMBER請求服務(wù)端返回新生成的號碼。此時(shí)觀察兩點(diǎn)取號端界面應(yīng)顯示您的號碼是 A001前面還有 0 人服務(wù)端的日志窗口或日志文件里應(yīng)打印一條插入排隊(duì)記錄的操作記錄。然后在窗口端點(diǎn)擊呼叫下一個(gè)服務(wù)端日志會打印A001 分配至窗口 1大屏端界面應(yīng)隨即顯示請 A001 到 1 號窗口語音模塊同時(shí)播報(bào)一遍。最后在窗口端點(diǎn)擊辦結(jié)服務(wù)端把記錄狀態(tài)置為3大屏端把這條叫號信息從顯示區(qū)移除。這四步走通整個(gè)系統(tǒng)的核心鏈路就驗(yàn)證完成了。如果在大屏端聽不到語音播報(bào)先檢查系統(tǒng)是否安裝了 TTS 語音包源碼里語音模塊用的是 Windows 自帶的語音合成接口精簡版系統(tǒng)可能缺失語音引擎但不影響業(yè)務(wù)鏈路。這一步很多人容易誤判為代碼問題其實(shí)環(huán)境問題占多數(shù)。5. 避坑指南排隊(duì)機(jī)項(xiàng)目部署里最常見的五個(gè)翻車現(xiàn)場5.1 窗口端連不上服務(wù)端提示遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接這個(gè)現(xiàn)象多發(fā)生在服務(wù)端程序跑得好好的、窗口端卻反復(fù)連接失敗的時(shí)候。最常見的原因就兩個(gè)一是服務(wù)端只監(jiān)聽了本機(jī)回環(huán)地址而不是0.0.0.0導(dǎo)致局域網(wǎng)內(nèi)其他機(jī)器根本連不進(jìn)來二是 Windows 防火墻默認(rèn)攔截了 9100 端口的入站連接。排查時(shí)先在窗口端所在機(jī)器用telnet 服務(wù)端IP 9100測一下端口通不通不通就去服務(wù)端執(zhí)行一條放行命令netsh advfirewall firewall add rule nameQueueServer dirin actionallow protocolTCP localport9100另外一種隱蔽的原因是服務(wù)端監(jiān)聽了 IPV6 地址而客戶端用 IPv4 解析兩端沒有配到同一個(gè)協(xié)議棧上。處理辦法是確保服務(wù)端監(jiān)聽時(shí)IPAddress.Any而不是顯式指定具體 IP。5.2 叫號后大屏要等兩秒才刷新像卡住了一樣如果你接手時(shí)大屏端還是輪詢數(shù)據(jù)庫的實(shí)現(xiàn)那這個(gè)現(xiàn)象幾乎是必現(xiàn)的。大屏端每 2 秒查一次T_QueueInfo里有沒有新叫號的記錄查到才刷新界面體驗(yàn)就是叫號慢半拍。其實(shí)窗口端點(diǎn)了叫號數(shù)據(jù)一毫秒內(nèi)就寫進(jìn)數(shù)據(jù)庫了慢的是輪詢周期。解決思路是把大屏端改成 Socket 推送模式。服務(wù)端在CallNext和重呼完成之后直接把SVR_CALL_NOTIFY主動(dòng)推送給所有已注冊的 Screen 端大屏收到消息立刻刷新延遲從輪詢周期縮短到網(wǎng)絡(luò)時(shí)延。這個(gè)改動(dòng)需要?jiǎng)臃?wù)端的ScreenBus.Broadcast方法和客戶端的消息接收處理如果手頭這份源碼已經(jīng)是大屏主動(dòng)推送的版本就直接跳過這條。5.3 兩個(gè)顧客同時(shí)取號拿到了同一個(gè)號碼這在數(shù)據(jù)庫開發(fā)里屬于并發(fā)經(jīng)典的翻車現(xiàn)場。取號邏輯如果用先查詢MAX(Seq)再在代碼里 1最后 INSERT的老寫法兩個(gè)請求并發(fā)執(zhí)行時(shí)可能同時(shí)讀到maxSeq5各自插一條A006進(jìn)庫。事務(wù)內(nèi)查詢不加鎖或者隔離級別設(shè)成READ COMMITTED都擋不住這個(gè)問題。正確的修法是給取號邏輯的事務(wù)加上IsolationLevel.Serializable或者可重復(fù)讀并且在查詢語句里帶上WITH (UPDLOCK)。另一種方案是給T_QueueInfo的(BusinessTypeId, QueueNO)建唯一索引插入時(shí)捕獲重復(fù)鍵沖突然后重試一次。兩者可以共存但事務(wù)加鎖是更符合叫號業(yè)務(wù)的做法重試邏輯只能算后悔藥。5.4 系統(tǒng)跑了兩天數(shù)據(jù)庫連接池爆滿服務(wù)端開始報(bào)連接池已達(dá)到最大大小這個(gè)坑大多不是源碼本身的問題而是二次開發(fā)時(shí)到處new SqlConnection忘關(guān)導(dǎo)致的。叫號這類服務(wù)端程序長時(shí)間運(yùn)行任何一個(gè)請求路徑上泄漏一條連接半天就能把默認(rèn) 100 條連接池耗盡。排查方法很直接在 SQL Server 里執(zhí)行SELECT * FROM sys.dm_exec_sessions WHERE login_namesa看會話數(shù)是不是只增不減是的話就是代碼里沒用using釋放連接。建議重構(gòu)數(shù)據(jù)訪問層統(tǒng)一由一個(gè)DBHelper管理連接創(chuàng)建和關(guān)閉每次取連接都走using (var conn DB.CreateConnection())的寫法確保任何異常路徑都不會泄漏連接。5.5 服務(wù)端升級重啟后隊(duì)列里已叫號的號碼全部卡死服務(wù)端重啟一小會兒重新連上的大屏上那些叫到一半的號碼狀態(tài)全是已叫號但顧客早就被晾在一邊了。原因是隊(duì)列狀態(tài)存在數(shù)據(jù)庫里但叫號通知只存在于大屏的內(nèi)存中服務(wù)端一重啟沒有哪塊邏輯去接管這些半途狀態(tài)。解決辦法是給服務(wù)端寫一個(gè)啟動(dòng)恢復(fù)邏輯進(jìn)程起來后先把所有Status1且CallTime停留在 30 分鐘之前未辦結(jié)的記錄重置為0或直接置為過號2然后向所有大屏端廣播一次SVR_SCREEN_SNAP隊(duì)列快照讓屏幕恢復(fù)到正確的隊(duì)列狀態(tài)。這段邏輯要放在服務(wù)端開始接收新請求之前執(zhí)行否則恢復(fù)的同時(shí)又來新叫號狀態(tài)又會亂掉。6. 二次開發(fā)給叫號系統(tǒng)加預(yù)約取號和微信提醒如果讓我在這個(gè)項(xiàng)目上做第一個(gè)改造我大概率會先做預(yù)約簽到這個(gè)功能。現(xiàn)在銀行網(wǎng)點(diǎn)和醫(yī)院分診臺普遍支持線上預(yù)約后到現(xiàn)場取號核心訴求是讓預(yù)約過的顧客到了現(xiàn)場能優(yōu)先叫號。落在代碼上需要改三個(gè)點(diǎn)T_QueueInfo表增加SourceType字段區(qū)分預(yù)約和現(xiàn)場取號端加一個(gè)輸入預(yù)約流水號簽到的入口以及改叫號調(diào)度算法讓預(yù)約號優(yōu)先出隊(duì)。/// summary預(yù)約優(yōu)先的叫號調(diào)度先取預(yù)約等待號再取現(xiàn)場號/summary private string PickNextQueueNo(int businessTypeId) { // 優(yōu)先把 SourceType1 且狀態(tài)為等待中的預(yù)約號叫出去 string next GetNextBySource(businessTypeId, sourceType: 1); // 預(yù)約隊(duì)列取空了才輪到現(xiàn)場號 if (next null) next GetNextBySource(businessTypeId, sourceType: 0); return next; }微信提醒的改造相對獨(dú)立可以在服務(wù)端加一個(gè)后臺定時(shí)器掃描Status1的已叫號記錄超過一分鐘就調(diào)一次第三方 HTTP 接口把您的號碼已叫號請前往 3 號窗口推給公眾號模板消息。這一塊完全不碰現(xiàn)有業(yè)務(wù)鏈路適合作為練習(xí)讀源碼的切入點(diǎn)。這套源碼我斷斷續(xù)續(xù)拆過兩遍第一遍只顧著把取號邏輯跑通直到現(xiàn)場被兩個(gè)窗口同時(shí)叫號互相卡死的問題折磨了一下午才回頭把UPDLOCK, READPAST的語義吃透。從那以后我每接到一個(gè)消息分發(fā)類項(xiàng)目都會強(qiáng)制自己先畫出狀態(tài)流轉(zhuǎn)圖和消息時(shí)序圖再動(dòng)手把哪個(gè)事務(wù)該鎖住哪一行、哪條廣播該放在提交之后先想明白??此撇黄鹧鄣呐抨?duì)叫號里頭的并發(fā)和數(shù)據(jù)一致性考量一點(diǎn)不比高并發(fā)秒殺系統(tǒng)少希望這份拆解能幫你在跑通和改造的全程少踩幾個(gè)坑。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
秋霞男人网| 日本三级日本三级99| 精品性爱无码在线播放| 99re99在线视频| 五月丁香社区婷婷日韩欧美精品影院| 97国产综合欧美| 粉嫩不卡一区二区性爱 | 青青草在线视频播放器| 亚州色国| 77777亚洲蜜臀精品久久综合蜜臀| 熟女熟妇一区二区三四区| 99亚洲精品| 国产一国产一级毛片古装| 亚洲 无码 偷拍| 884t在线| 五月天大香蕉| 思思热久久成人| 97资源站久久| 男人的天堂网页| 日本裸体久久色噜噜| 天堂无码| 欧美日韩精品青青| 9久综合网| 中文字幕蜜乳av| 欧美色吧综合| 中文字幕一区 二 区 三 四 五 区日 日 骚 | www超碰| 插穴性爱视频在线观看| 蜜臀久久99精品久久久久久-DVD| 亚洲一二三四区机械| 韩国成人精品久久久免费看 | 久久久精品日本一道| 翔田千里AⅤHD无码| 伊人操操| 黑丝内射一区二区三区| 另类一区| 26uuu性物| 一二三区视频在线观看| 国产AV人人 夜夜人人澡| 久久久久久久久久久人妻| 色爱综合网| 成人日本视频人妻在线| 日韩成人在线性爱视频| 无码精品久久| 欧美人人曰人人操人人射射| 久久精品人妻一区| 亚洲一区二区三区不卡国产欧美| 日韩欧美福利视频看看| 加勒比综合88| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 久久久久久久精| 日本Xx性爱| 国产精品一区在线播放| 九九九九免费| AV污污污污| 乱伦3P视频| 日韩人妻无码专区| 丝袜熟女一区二区三区| 97色婷| 亚洲有薄码区日本系列中文字幕| 四虎永久在线精品免费网址 | 国产又粗又大硬免费色网视频| 综合大香蕉美。| 熟妇人妻精品一区二区| 98久久超碰| 欧美色网| 日本高清有码网址视频| 日韩久久三区| 91男女啊啊啊| 精品女同一区| 成·人免费午夜在线观看| 亚洲激情在线观看一区| 亚洲四虎熟女精品| 国产天天骚| 一区二区偷拍拍视频| 久操B网| 亚洲青青青视频在线| 物尤视频一区二区| 欧美在线色| 老鸭窝黄色视频网站| 亚州色图狠狠干| 懂色中文一区二区三区| 乱色视频中文字幕| 天天操熟妇| 牛牛操视频逼| 国产成人亚洲精品自产在线 | 新婚人妻扶着粗大强行坐下| 中文字暮97| 伊人9| 欧美同性恋 的搜索结果 - 91n| 97亚洲色图| 亚洲第一狼人丝袜美女另类| 久久精品天美| 欧亚韩国999| 国产v亚洲v日韩v欧美v片另类| 亚洲精品尤物yw在线影院| 亚洲 日本 一 二 三| 熟女网站最新| 免费日韩黄片| 国精综合一二三区影视| 亚洲爽图| 91欧美高清| 日本精品国产视频| 大肥女高潮bbwbbwhd视频| 偷窥自拍亚洲天堂网爆| 天天操人人操骚逼网站| 一区二区高清视频| 色性综合| 中文字幕中文字幕一区二区| 激情亚洲天堂| 无码137片内射在线影院| av婷婷色婷婷色六月| 久久熟女久| 亚洲精品一二三四区| 成人情色综合网| 国产高清精品福利| 亚洲春色欧美| 亚洲在线欧美| 国产对白刺激视频| 91精品啪在线观看国产城中村| 香蕉在线一区二区三区| 精品传媒在线一区| 蜜乳视频网站| 久久精品色欧美aⅴ一区二区| 亚洲一区二区三区麻豆传媒| 久久久亚洲熟妇熟女| 狠狠狠狠狠狠| 天天久久久久久| 超碰在线国产| 日本男人天堂| 亚洲情色综合网| 欧洲熟妇xxXx欧美老妇裸体 | 免费成人自拍视频在线| 好一吊区二区| 久超超碰| 岛国视频免费在线观看| 亚洲欧美97| 色噜噜综合在线| 欧美黑人熟妇精品91| 欧美极品女人的天堂| 久久无码精品| 欧美97在线观看| 国产特级毛片AAAAAA高潮流水| 99在线观看| 精品日日人妻| 久久久免费懂色| 99老司机精品视频在线观看| 久久有码视频| 久久久工口| 狠狠色狠狠色狠狠五月| 91美女色视频亚洲| 91一起操| 久操91视频| 久久香蕉超碰97国产精品| 成人性爱美曰韩| 欧亚日韩综合精品国产| 免费观看日本操逼视频| 色呦呦、国产精品| 久久高清欧美国产| 日韩兔费看黄片| 午夜精品久久999热蜜桃介男人用| 免费操逼视频下载| 久久黄片国产一区二区| 诱惑网综合| 日本中文字幕一区| oumeisetupian| 强奸a片网| 大香蕉欧美| 国内一区二区三区| 天天看综合网| 亚洲最大无码中文字幕网站 | 超碰97资源大奶| 亚洲图片偷拍视频区| 欧美极品美女aaaaaa级黄片| 亚洲少妇视频| 99精品综合久久久久五月天| 哈哈操电影AV| 日韩三级一区| 欧美国产日韩清纯唯美| 久久免费精品视频免一| 精品一啪| 亚洲阿v天堂无码z2018| 狠狠操狠狠操操| 欧美91网| 日本三级小说中文字幕| 五月婷婷无码| 成人一级性爱| 国产精品久久久亚洲一区| 免费日韩黄片| AA级电影三区| 国产精品女aA片爽爽视频| 夫妻AV网站| 久久久成人免费av电影| 国外91| 九一综合精品视品av| 日本三级中国三级99人妇网站| www…国产操逼| 无码天天操| www亚洲免费| 国产成人自拍视频视频| 国产女人高潮嗷嗷嗷叫小说| 无码直播久久久| 精品人妻一区二区三区日产| 精品国产乱码久久久| 国产精品69久久久久久久| 色天堂在线观看| 97国产亚洲中文在线| 欧美专利1区2区3区4区5区免费| 99热最新| 亚洲熟妇丝袜在线观看| 亚洲人在线成线成人| 北京专精特新企业招聘信息| 伊人久久大香蕉线AV五月天| 99只有精品| 久久超碰大香蕉| 91女优在线观看 | 欧美精品偷拍| 伦在线97| 久久久久96| 久久久久亚洲Aⅴ无码| 亚洲成人福利电影免费| 国产精品蜜乳AV| 无码逼| 秋霞曰韩R级| 色综合色欲色综合色综合色综合| 亚洲巨爆乳一区二区三区四季网| 秋霞Av理论一级在线| 亚洲中文字幕在线视频一区二区| 色色香蕉| 婷婷丁香六月| 亚洲精品欧美专业| 爱丝福利| 97精品| 亚洲系列第一页| 日韩,欧美,中文在线| 91婷婷| 超碰国产情侣自拍网| www.91欧美| 97中文综合| 久久 精品| 91丝袜| 思思热在线视频免费| 人人操人人操草草| 国产农村妇女精品一| 91亚洲丝袜| 夜夜精品视频| 亚洲欧美国产成人综合不卡| 成人综合视频久久| 欧色网址| 国产精品免费日韩| 黄色不卡视频| 日本一级特级毛片视频| 日韩性爱播放| 亚洲欧美一区二区不卡视频播放| 99999国产精品| xxxx网站亚洲精品| 日欧毛片久久| 国产91福利小视频在线观看 | 国产后入清纯| 先锋色眉乱伦资源| 91色五月俺来也| 超碰4A| 热久久国产| 日韩三级一区| 久99在线免费观看视频| 超碰在线观看av不卡| 97色在线观看| 玖草在线视频| 久久人妻视频| 亚洲精品黄码久久久久| 国产久久av| 欧美少妇大量自拍视频在线观看| 欧美日韩中文字幕人妻| 国产亚洲禁久一区二区 | 男女性感激情网站| 91在线限制级| 九九九免费视频| 久久九九网| 男人天堂久久精品不卡| 伊人久久大香线蕉无码| 久久111| 欧美天天射| 亚洲国产精品久久久久婷婷老年| 亚洲无码免费看| 超碰 av 女人天堂| 精品国产91av一区二区三区| 久久亚码| 亚洲aV无码成人在线观看| 亚洲国产亚洲天堂| 怡红院一区二区熟女人妻| 亚洲欧美在线综合| 99在线观看| 久9精品| 亚洲色色色| 99re久久| 蜜桃视频精品一区二区三区| 91在线秘 男同| 超碰 av 女人天堂| 狠狠中文字幕| 神马久久免费电影观看| 五月激情小说| 日韩极品无码B| 亚洲妇色| 屁屁影院一区二区三区国产| 992大香蕉| 狠狠中文字幕| 蜜乳av一区二区| 日韩欧亚中文在线| 亚洲欧洲国产综合av| 久热精品在线| 大香蕉伊人亚洲| 欧美十八禁视频| 欧洲精品人妻| 久久草在线综合视频| 97久久精品不卡| www.99色| 综合久久久久久久综合网| 夜夜操中文字幕| 成人性爱电影网| 伊香蕉综合久久久久久久噜噜噜| 人妻精品综合中文字幕在线 | 色色香蕉| 快灬快灬 一下爽蜜桃在线观看 | 综合色图亚洲欧美| 强奸乱伦AV网站| 少妇熟女视频一区二区三区| 精品四五区| 国产日韩精品人妻久久久久色欲网站| 碰人碰碰人人开房人肉| 中文字幕91综合| 久久91视频| 欧美人妻少妇| A一级色女| 亚洲人成色9999精品久久| 人妻干天天| 久9综合在线| 精品人妻夜夜草| 日韩一级片在线看| 国产成人超碰在线| 天天做天天爱| 日韩黄色小说| 大香蕉欧美日韩| 中文字幕在线高清男人的天堂| 污色区网站| 操91| 自拍丝袜美腿人妻| 亚洲综合网电影91| 2020国产精品| 中日韩熟女| 91久久| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 18禁网站在线播放| 韩国免费播放一级毛片| 99re视频在线播放青草| 亚洲综合色在线| 今日头条成人一区二区三区四虎精品| 嗯嗯嗯啊啊啊在线免费观看| 激情五月婷婷综合| 不卡啪啪视频| 久久婷综合| 成人性爱视频在线看| 人人爱人人乐人人操| 日韩电影中文字幕| 久久色AV线| 日韩中文字幕熟妇人妻| 猛交交| 99热欧美| 黄网在线播放| 五月天偷拍| 人妻熟女av国产网站| 国产啊v在线免费播放| 丁香婷婷五月| 性色AV蜜色av色欲av| 97亚洲在线| 国内一级精品| 综合网天天| 精品福利| 国产精品白丝在线播放| A片A5445444| 欧美国产精品久久九九| 女人天堂av在线播放| 97国产精品一区| 一本色道人妻久久| 超碰人妻久久| 超碰97久久| 97在线视频免费| 亚洲天天操| 亚洲黑人在线| 富女玩鸭子一级毛片| 中文久久| 日韩免费高清大片在线| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 中文一区在线日| 欧洲自拍色图gif在线| 国产精品久久久九九九| 99后入| 人妻另类| 欧美日韩在线小说 | 国产剧情一区在线观看| 九九十八精品| 国产美女口爆吞精视频| 唐山老熟妇露脸啪啪叫| 天天日天天操心| 亚洲熟女国产综合另类| 91 丝袜在线观看| 欧美色干| 一起草三级AV电影在线观看| 吖在线不卡一区二区国产剧情| 最新国内自拍av免费| 亚洲AV操| 超碰97欧美在线| 久久视网78| 久久偷偷色综合蜜桃| 超碰人人干天天射| 欧美人与动性人交a| 日本性爰一道本| 久久久com| 蜜桃臀 后入 一区 二区 三区 在线| 96精品久久久久中文字幕| 国产精品不卡一区二区三区| 欧美色97| 岛国福利在线精品播放| 91狠狠色丁香婷婷综合久久精品| av午夜玫瑰| 色噜噜人妻av中文字幕| 欧美日韩啪啪电影| 日本大片日本一区二区免费高清| 嗯嗯啊啊视频一区二区三区| 天美av在线| 国产精品亚洲无码| 韩日精品四区| 成人资源中文字幕在线观看| 岛国免费黄色网址| 九九毛片这里只有精品| 亚洲脚交| 国产精品极品美女视频| 青青操97| 91精品91久久久中77777| 国产精品一区二区亚洲人成毛片| 九九在线视频| 热热色国产一二区AV| 亚洲高清视频在线免费观看| 91丨九色丨东北熟女| 97爱b| 加勒比综合| 国产超碰欧美| 国产51色综合久久免费| 人人摸人人干| 国产成人在线观看网址| 婷婷五月丁香五月| 国产夫妻性生活视频| 免费av在线播放二区| 嗯啊啊啊轻点视频| 97香蕉网| 91亚·色| 日日爱99| 男人的天堂在线有码| 久草成人影片| 日本熟妇人妻中出视频| 亚洲天堂资源| 中文字幕aⅴ在线视频| 97AV在线免费观看| 激情抓乳插进去啪啪啪日韩 | 黄片qw| 国产人伦精品一区二区三区 | 欧美人妻色| 国产高清视频无码在线| 91色图片| 综合五月婷婷亚洲一区| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 中文字幕精品三级久久久| 色网在线视频观看免费| 涩涩久久精品| 成人午夜视频免费播放| 玖玖爱视频网站| 熟女突然公开看18禁影片| 日韩精品影视| 国产综合操逼高清| 久久在肏| 日本不卡三级网在线播放| 人人操人人摸人人骑| 亚洲。日韩。欧美| 天天摸夜夜添无码小视频| 欧美性生活内射| 日韩A优精品在线观看| 啊啊啊啊啊啊啊网址在线观看| 操逼操逼视频操逼| 91超碰在线观看| 99热综合| 国产精品久久久无码aV去| 国产久久日| 亚洲操逼无码| 欧美人妻少妇| av东京热男人的天堂| 好屌色综合| 一级黄色性爱A级片| 久久久91福利姬| 伊人AAA| 国产一区二区三区免费视频在性观看 | 加勒比人妻综合| 国产无套粉嫩白浆在| 美女黄网| 午夜综合在线| 日本免费一区二| 亚洲成人无码影院| 中文字幕乱码在线观看| 韩国三级三级BD在线| 成年人一级黄色毛片大全在线观看| 精品十八在线观看| 午夜欧美J进J出白浆流出久久久| 欧亚在线视频| 天天日天天搞天天干| 蜜桃AV天堂| 日本精品88888888| 超碰在线人妻| 欧美极品少妇| 日韩精品亚洲专区在线影视| a网站免费观看| 黑人中出21连凳花野真衣| 麻豆AV96熟妇人妻| 狠狠爱夜夜干| 久久性爱视频免费看| 丰满岳乱妇一区二区三区| 久久东京热久久| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 婷婷久久综合| 操逼网免费无码视频| 色哟哟 日韩精品| 精品国产乱码久久久久久免费| 欧美黑人与女人91~| 99久久9| 青青草九九九九九| 乱伦3P视频| 午夜福利1区2区3区| 欧美综合色图网| 亚洲九九爱| 亚洲视频一二区| 亚洲人妻一区二区三区| 婷婷五月综合在线| 国产伦乱91| 一牛影视成人片免费| 尤物av网站免费在线播放| 日本一线产区和二线产区伦理片| 中文字幕人乱码中文字的预防方法| 丁香五月天婷婷姐| 91爱综合| 91 丝袜在线| 久久久久国产亚洲一区欧美色图日韩 | 嗯啊不要啊啊在线观看视频| 情侣开房子拍 日韩无码 女的很漂亮| 久久精品性| 国产精品自在自拍视频| 亚洲天堂7777| 黄色网址在线免费观看| 婷婷去俺也去六月色| 99视频这有这里有精品| 日韩成人精品| 日本十八禁免费看污网站| a片在线播放| 日本国产欧美一区三区二区 | 三上制服丝AV| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | av资源在线播放天堂| 欧美日韩国内不卡| 国产精品熟女乱伦| www色色色com| 激情文学网伊人| 大香蕉伊人色偷偷在线| 久久久久久久久久久97| 久久久久久久久久久久黄色 | 国产精品视频内谢女人| 99999精品| AV乱伦专区| 中文字幕人成乱码熟女香港| 欧美日韩国产黄色片| 国内毛片婷婷六月色| 每日更新AV| 二色av| 玖色AV| 中日韩久久人妻一区二区| 欧洲精品人妻| 久久久久女教师免费一区 | www激情| 婷婷色一区| 97 国产一区| 偷拍片久久| 国产成人五月天丁香花| 精品人妻免费观看| 无码日韩人妻av一| 91一区二区| AV天堂男人的天堂| 色婷婷日韩精品一区二区三区 | 有码人妻系列| 欧美在线|亚洲| 女性91网站| 韩国成人精品久久久免费看| 天天爱天天韩国日本牛牛牛牛| 蜜臀av中字字幕网站| 国产噜噜噜噜噜久久久久久久久| 中文字幕乱妇免费视频| 收看日本人日bb| 色欲久久综合| 亚洲成人色情五月天丁香花| 欧美天天综合在线| 99热99在线播放激情| 日韩国语字幕| 色五月AV在线| 日欧操屄| 久久久久久亚洲精品不卡人乳| 夜夜嗨绯色| 亚洲图片欧美色| 无码在线亚洲| 99亚洲人人| 天天色欧美| 中文字幕123| 欧美少妇第一页| 国内毛片四区| 国产乱人伦AVA麻豆软件.| 九九九网页| 78m啪啪啪| 成人性爱美曰韩| 日韩午夜国产| 老熟女乱伦片| 蜜臀av在线播放一区二区三区| daxiangjiao你懂的| 殴美,日韩国产伦精品| 中文字幕欧美日本乱码一线二线| 国产无码精品高清| 日本天天人人狠狠在线日美女| 成人草草视频| 能直接看AV的网站| 久久宗合亚洲| 无码天天操| juliaann丝袜大战黑鬼| 91被操| 97超碰碰碰| 97视频免费播放| 久久亚洲婷婷| 男人的天堂com| 成人av动漫在线观看| 欧美综合 站| 国产高清精品一区二区三区毛片 | 夜夜欢天天干| 欧美有码激情视频一区二区三区| 99少妇内射| 操91| 午夜操一操| 欧美日韩国产中文精品字幕自在自线, | 天天干天天燥| 东京热熟女亚洲视频网站| 成 人片 黄色大片| 亚洲日韩乱码中文无码蜜桃臀网站| 涩涩涩综合| 亚洲污污网站| 日本精品高清一二区一本到| julia ann久久| 日本一级性爱| 日本媚薬中文字幕在线| 美女啊啊啊啊啊啊啊| 欧美国产精品久久九九| caopeng97人妻| 国产欧美精选自拍一区| 婷婷久草| 涩五月婷婷| 亚洲欧美色图片| 高清不卡一二三区视频......| 日本伦乱九九九综合| 麻豆精品A片免费观看| 免费一级a毛片久久久久久鸭绿欲| 99在线视频播放| 久久久久九九九| 97超碰大| 99操| 动漫爆乳3D奶水一区在线观看| 91精品久久久久| 国产视频一区二区三区久久亚洲天堂 | 蜜臀国产AV中文字幕| 首页亚洲国产高跟丝袜诱惑视频| 啊啊啊想要| 欧美日韩青操| 天天综合色| 国内毛片国产欧美拍| 国产高清在线自在拍69| 欧插网站| 日韩A优精品在线观看| 久久久久久久久一区二区三区| 亚洲精品一二三四区| 丝袜剧情| 欧美性爱第1 页| 91熟女.com| 天天干2区3区| 爆操无码| www.久久制服糖| 久久伊人东京热| 成人热久久精品| 91狠狠综合久久久久久| 大黄片做爱的大的| 国产精品久久久久久久久久久久久久吹| 一区二区三区四区五区高清无码永久视频 | 久草精品国产99| 国产一区二区精品久久久不卡蜜臀| 97二区四区| 亚洲AV无码乱码在线观看性色| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 亚洲精品97在线| 最新国产精品久久精品| WWW啪啪的com| 亚洲av性爱电影| 国产白丝网站| 日韩精品国模| 久久久久久久久久久久黄色| 东京热男人的天堂网| 乱伦日本色图AⅤ| 天天爽夜夜爽夜夜爽精| 亚洲色阁| 粉嫩av一区二区三区天美传媒| 劲爆欧美人妖三区91| 麻豆黄四叶草网站| 97二区四区| 亚洲综合小说另类图欧美视频激情小说色五月天| 最新三级网址| 午夜精品久久久久久久久久蜜桃| 九九热九九| 国产日韩怡红院| 夜夜嗨一区二区三区三州加勒比| 老鸭窝黄色视频网站| 一区 欧美 日韩 麻豆| 男人天堂.AB| 一区二区偷拍拍视频| 99激情视频| 色婷婷网| 91精品婷婷国产综合久久| 97日视频| 蜜臀久久99精品| 啊啊啊啊啊好大好舒服想要| 久久精品亚洲东京热色播| 另类综合另类| 东京太热久久久| 91n美女视频| 熟妇人妻一区二区| 曰本精品久久久| 久草婷婷| 97热视频在线观看| 久久精品无码不卡| 欧美综合色图网| 九九热av| 成人羞羞视频国产| 高清国产无码av| 人妻丰满熟妇一区二区三| 樱花蜜乳av| 91久久精品中文字幕| 国产第25页在线观看| av片在线观看免费播放| 色吧综合网| 天堂岛av| 9 7超碰在线免费观看| 色大师网站www永久网站视频| 97久久久精品| 激情小说亚洲视频| 天天综合网~91| 囯产精品久久久久久久久久二区三区| 凹凸视频在线一区二区| 強姦亂倫a| 欧美日韩在线国产在线| 亚洲色综合| 男人的天堂在线2| 国产乱人妻精品入口| 老色鬼成人精品视频下载大在线观看| 香港久久久| 污色区网站| 久草国产在线视频| 五月激情天| 成人综合网 欧美| 亚洲,欧美,综合网| 91性色| 国产91乱伦| 久久精彩免费视频| a人欧美综合天堂麻豆| 国产三级中文字幕粉嫩 | 蜜臀精品1区2区| 黑人干亚洲| 啊啊啊啊操死我| 日韩激情啪啪啪| 91蜜桃婷婷狠狠久久综合9色| 夜夜高潮夜夜爽| 精品制服美女中文一区二区三区| 神马久久午夜| www黄片免费看com| 熟妇女人妻呻吟久久AV| 白嫩妹子国产骚| 超碰日韩人妻| 狠狠干综合| 日本中文字幕一区| 中文字幕欧美日韩三级| 手机看av网站在线看| 三级片大波波| 一二三区精品视频| 国产欧美一级在线观看| 成人精品电影| 国产午夜精品一区二区三区牛牛| 飘花国产午夜精品不卡| 亚洲nv男人的天堂网| 一区二区三区色综合| 亚洲色图欧美一区二区不卡| 久久久久久久久成人av解说| 99人妻| 亚洲成?V人片在线观看福利| 狠狠操一区二区| 久草加勒比一区在线| 大地资源在线观看中文第二页| 色诱avtt| 日本黄大片在线观看视频| 天天插天天干| 美女黄色91| 97任你吞精| AV中文字幕剧情1区2区3| 色综合国产在线观看| 淫妻综合网| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 超碰97人人乐| 久久国内| 欧洲亚洲人人爽爽视频| 成人av影院在线观看| oumeisetupian| 人人操人人色网| 97中文天堂| 亚州91| 亚洲日本韩国极品一区二区| 久草这里只有精品| 大香蕉AV在线| 91亚洲影视| 综合熟女| 色97干| 天美传媒一二三区永久网站| 91色花堂| 97视频在线免费看| 日本孕妇一区二区视频操逼免费看 | 亚洲大色堂| 熟妇的味道HD中文字幕| 有码色中文字幕在线观看| 无码一区免费在线不卡| 97人人爱人人做人人乐| 欧美不卡在线一区二区| 国产天天看| 91人妻中文| 亚洲不卡一| 亚洲成av人片色午夜乱码| 啪啪啪男女亚洲中文字幕99| 天天流夜夜操| 一区AV| 亚州日韩97| 免费看久久久性性| 欧美色图电影| 日本裸体久久色噜噜| 为用户提供免费看黄网址在线观看| 天美传媒AV国产在线| 在线中文字幕极品av| 97久久超碰亚洲| 五月婷婷六月天| 五月丁香激情四射| 国产人妻一区二区三区欧美毛片| 日日操丁香五月天| 97视频在线观看免费高清| 精品久久久九九九孕妇| 8x福利精品第一福利视频导航| 亚洲日韩东京热一区| 99熟女| 99精品国产户外露出| 99久热精品99re6热| 深田咏美亚洲精品福利社| 婷婷伊人| 成人一道本免费视频| 操淫穴亚洲五月丁香| 在线只有精品| 麻豆国产视频精品观看| 亚洲欧美内射| 超碰午夜在线| 久久久精品成人国产| 精品99999| 加勒比色综合| 偷拍网站久久男女男| 操逼啊啊啊91| 一级一性爱免费视频| 欧洲大香蕉| 东北黄色电影| 美女被艹尤物视频| 国产v片在线免费观看| 中文字幕av一区二区三区人妻少妇| 亚洲欧美激情另类色图| 夜夜影视四色| 五月丁香六月综合缴清无码| 久久婷婷一区| laoshunv91| 国产欧美伊人| 日韩黄色一区二区三区| 日韩强奸av| 亚洲色电影在线| 呦女网站| 大香蕉伊在线久草麻豆天堂故事| 91久久久久久久| 久久国产热视频97电影| 秋霞午夜成人福利片片| 久久久久久久久9| 色娱乐色呦呦夜夜夜夜av| 欧洲综合视频| 91九色精品熟女内射| 干干干天天| 日韩视频精品在线观看| 嗯嗯啊啊啊好爽| 久久久久久中文| 久久久久网站-538在线视频-欧美永久乱码| 色色色网站| 伊人色综合网电影| 日韩色| 国产精品日韩在线一区| 色哟哟 日韩精品| 大奶的诱惑| 成人三级片一区二区三区视频| 久操影视| 欧美激情色婷婷花野真衣一区二区| 欧美精品在线观看| 97久久久久久久精| 大香交伊人网| 桃色五月天| 国产女人成人精品视频| 粉嫩粉嫩一区性色AV片| 2017人人操,人人摸| 内射老妇BBWX0C0CK| 69国产对白刺激| 日本影视久久免费| 欧美亚洲综合高清在线| 97av在线观看| 97天堂| 偷拍 亚洲 欧美| 欧美色女人| 成人毛片免费| 欧美福利视频啊啊啊啊| 亚洲伊人久久综合97| 操操操五月天婷婷丁香影院| 国产精品久久久久久久无码AV| 欧美资源| 伊人一级免费黄片| 久久亚州精品成人Av无| wwwxxx日本爽| 青青操综合网| 无码在线亚洲| 色9999日韩国产| 婷婷月色| 超碰97资源大奶| 婷婷美人网| 天天大干大香蕉| 天天操天天舔| 簧片免费看视频| 亚洲色图大香| 亚熟在线| 欧亚日韩综合精品国产| 97资源站国产精品| 91综合网| 成人av在线播放| 韩日无码在线观看| 狠狠操狠狠插| 第45页一区二区| 国产精品久久久久久夜夜夜夜| 天天天操天天天爱| 天堂性色| 都市久久精品激情亚洲| 黑人无码一区二区| 五月丁香网站| 久久国产对白激情浪潮| 四虎影视 亚洲无码| 亚洲图片欧美| 国产91精品福利在线| 俺去也婷婷| 97香蕉人人乳| 干b网| yw尤物av无码点击进入麻豆| 青青伊人这里只有精品| 天天干天天爽| 和协影院中文字幕三区| 色悠悠伊人网五月天| 日本爽爽爽爽爽爽免费视频| 欧美精品久久久久久久久88| 欧美极品女人的天堂| 日本淫穴在线| 国产60页| 亚洲无码久久久久久久| 伊人大香蕉在线| 国产精品69久久久久久久| 亚洲最新Av| 六月丁香久久| 极品粉嫩少妇视频| 天天做天天爱| 粉嫩不卡一区二区性爱| 国内精品不卡无毒99999| 91在线国产后入风骚翘臀美女素人| 亚洲国产精品久久AV| 久久东京国产精品视频| 久草新免费| 青娱乐妇女性生活| 亚洲精品人妻吞精av| 大香伊人在线一区| 97 色综合| 激情久久av一区av二区av| 五十路熟女工口| 欧美性第一页| 91久操| 本道在线| 99re公开精品免费视频| 久久久久久性爱视频| 美女91| 超碰精品在线| 综合97久久| 亚洲91在线播放影院| 99国产天美| 国产捆绑一区| 盗摄 精品 另类 一区| 国产视频97| 人妻乱仑一区二区三区| 东京热精品97综合网| 91P0RNY大屁股人妻| 久久黄黄| 国产精品第一页国产大屁股视频免费区| 日韩av不卡在线观看| 亚洲日韩久久精品一区| 日本 色 导航| 欧洲小说色图视频另类| 久久久一区二区三区三州| 蜜臀AV一区二区三区激情综合| 天天亚洲| 中文字幕二区日韩天堂| 亚洲天堂资源网| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 中国AAAAAA黄色片| 久久精彩视频9| 亚洲熟妇一,二,三期| 中文字幕二区日韩天堂| 久久九色| 欧美图片色综合| 青娱乐福利99| 神马午夜久久久| 久久精品欧美一区二区三区不卡| 91伊人大香蕉| 日本不卡高清视频| 激情文学 亚洲图片| 日人妻视频91| 人妻 欧美亚洲| 91九色网| 国产熟妇 码视频户外直播| 亚洲夜色在线| 婷婷久久五月综合激情| 久插综合| 国产操偷| 亚洲精品熟妇1区2区3区。| 五月婷婷六月丁香| V A在线| 综合亚洲欧美精品日韩?v| 96AV久久久| 青青伊人这里只有精品| 曰本道人妻久久久在线不卡色视频| 操逼网免费无码视频| 精品人妻丰满熟妇一区二区三| 91在线欧色| 久久久久久亚洲Av无码| 国产后入清纯| 日韩精品 资源| 天天日天天干天天色| AV色五月天| 久久超碰爱| 亚洲 日本 国产 综合| 福利大香蕉| 色女女女导航| 久久五十路熟女人妻| 另类老少妇| 九九九久千久久激情蜜桃在线看| 欧美精品成人在线播放| 91男人综合| 久久久久久久久久久久久9999| 久久久久亚洲av综合波多野制衣| 亚洲 欧美 日本 国内 首页| 91男女啊啊啊| 欧美日韩 强奸乱伦| 久久精品店| 蜜臀AV成人精品蜜臀| 亚洲无码99| 天天色黄色影院天天操| 91观看 国产白丝| 上床不卡网站| 99无码精品| 国产av又色又爽又黄| 日躁天天爽爽| 视频黄站| 综合干干干av久久久综合网| 欧美 亚洲 偷拍自拍| 国产AAAAAABBBBB| 99少妇| 九九九九九九视频| 天天肏美女| 色情五月综合婷婷| 久久这里是精品| 国产精品美女视频诱惑| 九9精品| 青青草精玖玖69精品| 六月丁香网| 十八禁成人网站在线观看| 久96热在线观看视频| 天天摸天天操视频| 91少妇通奸网站| 日本不卡二三区| 激激五月| 91综合在线| 亚洲精品亚洲人成在线麻豆| 中文字暮97| 日韩精品人妻中文字有码在线 | 一本大道久| 精品网站99999| 国产suv精品一区二区四| 国产精品熟女乱伦| 综合免费无码中文| 7777奇米影视久久| 午夜福利国产欧美日韩夜夜| rion磁力链接| aV中文麻| 亚洲风情综合网| 人妻美腿丝袜日韩| 蜜桃久久精品一区二区三区| 九九久久一区二区三区| 国产后入精品| 99热在线播放| 色婷婷五月综合激情中文字幕| 草莓精品视频在线免费观看| 亚洲欧洲成人在线电影| 神马久久久久久| 免费国产视频| 热99这里有精品综合久久 | 日本东京热加勒比久久| 18禁在线视频| 乱抡国产91| 亚洲熟女乱色一区二区三区 | 亚洲无限观看| 亚洲男人天堂2016| 久久久久9999妇女| 日韩三级在线观看mp4| 久久97资源 网| 玖玖爱一区在线| 亚熟hd视频在线| 日韩精品怡红院| 亚洲综合校园春色| 美女网站黄页| 三级三级三级a级全黄三| 自拍偷拍国产欧美日韩韩| 日韩激情电影中文字幕| 欧美真人抽搐一进一出gif| 亚洲国产精品成人综合| 亚洲无码国产精品久久| 精品国产一区二区三区四区在线看| 久久久久久久伊人精品| 男人高清无码一区二区| 国产亚州精品美女久久久免费| 国内自拍 日韩激情 99| 九九热精品|