精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HTML 5 WebSocket實現實時視頻文字傳輸

開發 前端
HTML5 擁有許多引人注目的新特性,如 Canvas、本地存儲、多媒體編程接口、WebSocket 等等。雖然現在大家把它捧的很火的樣子,但是個人認為它還需要其他平臺的支持才能真正的"火起來"。

HTML5 擁有許多引人注目的新特性,如 Canvas、本地存儲、多媒體編程接口、WebSocket 等等。雖然現在大家把它捧的很火的樣子,但是個人認為它還需要其他平臺的支持才能真正的"火起來"。

原來做web通信的時候 基于ajax的“輪詢” “長輪詢”等其他的方式 網上有很詳細的解釋

輪詢:

這是最早的一種實現實時 Web 應用的方案。客戶端以一定的時間間隔向服務端發出請求,以頻繁請求的方式來保持客戶端和服務器端的同步。這種同步方案的***問題是,當客戶端以固定頻率向服務器發起請求的時候,服務器端的數據可能并沒有更新,這樣會帶來很多無謂的網絡傳輸,所以這是一種非常低效的實時方案。

長輪詢:

長輪詢是對定時輪詢的改進和提高,目地是為了降低無效的網絡傳輸。當服務器端沒有數據更新的時候,連接會保持一段時間周期直到數據或狀態改變或者時間過期,通過這種機制來減少無效的客戶端和服務器間的交互。當然,如果服務端的數據變更非常頻繁的話,這種機制和定時輪詢比較起來沒有本質上的性能的提高。

流:

流技術方案通常就是在客戶端的頁面使用一個隱藏的窗口向服務端發出一個長連接的請求。服務器端接到這個請求后作出回應并不斷更新連接狀態以保證客戶端和服務器端的連接不過期。通過這種機制可以將服務器端的信息源源不斷地推向客戶端。這種機制在用戶體驗上有一點問題,需要針對不同的瀏覽器設計不同的方案來改進用戶體驗,同時這種機制在并發比較大的情況下,對服務器端的資源是一個極大的考驗。

最近WebSocket很火啊,曾經做通信都用的 長輪詢 后來.Net平臺上用上 “SignalR(關于這個有興趣的可以和我討論這里就不多說了)”這個血牛B的神器可以看看jabbr(基于它實現的多人聊天室,可能你訪問不到這個網站,請自備XX工具訪問 )和老外一起討論技術是不是很爽? 

簡單的介紹下SignalR 

SignalR 是一個集成的客戶端與服務器庫,基于瀏覽器的客戶端和基于 ASP.NET 的服務器組件可以借助它來進行雙向多步對話。 換句話說,該對話可不受限制地進行單個無狀態請求/響應數據交換;它將繼續,直到明確關閉。 對話通過***連接進行,允許客戶端向服務器發送多個消息,并允許服務器做出相應答復,值得注意的是,還允許服務器向客戶端發送異步消息。它和AJax類似,都是基于現有的技術。本身是一個復合體。一般情況下,SignalR會使用Javascript的長輪詢( long polling),實現客戶端和服務端通信。在WebSockets出現以后,SignalR也支持WebSockets通信(前提是使用.NET4.5的版本基于IIS8后面會有介紹)。當然SignalR也使用了服務端的任務并行處理技術以提高服務器的擴展性。

照官方的話講SignalR它可以實現全雙工的通信也就是實時的 而且它有一個“推送消息”的概念通過查看它的文檔和源代碼可以發現他也非常智能(自動檢測當前瀏覽器和服務器是否支持websocket如果支持則使用websocket通信否則是長輪詢),最牛X的是他是跨平臺的可以基于Mono!!!!

Mono!

多么牛X的框架!神馬IOS Android都能使用它!而且Android有一個叫做 SignalA(Signal for Android 不過它只支持Persistent Connections的連接方式)的框架可以***結合.Net做通信 我已經用上了 ^_^

Node Js 里面有個 socket.io 的東西 目測使用方法和SignalR 非常的類似(指的是Signal 的 Hub連接方式) 稍后會介紹的。

繼續說WebSocket 從w3c上看文檔能夠看到一些東西的比如

客戶端發到服務器的內容:

1.GET /chat HTTP/1.1

2.Host: server.example.com

3.Upgrade: websocket

4.Connection:Upgrade

5.Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

6.Origin: http://example.com

7.Sec-WebSocket-Protocol: chat, superchat

8.Sec-WebSocket-Version:13

從服務器到客戶端的內容:

1.HTTP/1.1101SwitchingProtocols

2.Upgrade: websocket

3.Connection:Upgrade

4.Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

5.Sec-WebSocket-Protocol: chat

關于這個概念 可以去參考 WebSocket簡單使用(一) - 概念然后今天要說的是 利用HTML5的 WebSocket做傳輸基礎然后Canvas繪圖 來實現視頻實時傳輸首先說一下平臺 Chrome和Safari的***版本瀏覽器已經支持是絕對可以的 火狐也可以(好像要用MozWebSocket) 然后恭喜IE10也支持了 最奇葩的時 Windows Phone8上的瀏覽器也支持參照網上的(來源自)先寫一個簡單的Demo應該是這樣

#p#

客戶端

在支持WebSocket的瀏覽器中,可以直接在Javascript中通過WebSocket對象來實現通信。WebSocket對象主要通過onopen,onmessage,onclose即onerror四個事件實現對socket消息的異步響應。

請創建靜態頁面 不用創建ruant=“server”的 否則會自動reload

  1. <!DOCTYPE html> 
  2.  
  3. <html xmlns="http://www.w3.org/1999/xhtml"> 
  4. <head> 
  5.     <title></title> 
  6.     <script type="text/javascript"> 
  7.         var wsServer = 'ws://localhost:9999/webSocket.ashx'; //基于.NET4.5服務器地址  
  8.         //var wsServer = 'ws://localhost:1818'; //基于.NET服務器地址  
  9.  
  10.         var websocket = new WebSocket(wsServer); //創建WebSocket對象  
  11.         //websocket.send("hello");//向服務器發送消息  
  12.         //alert(websocket.readyState);//查看websocket當前狀態  
  13.         websocket.onopen = function (evt) {  
  14.             //已經建立連接  
  15.             alert("已經建立連接");  
  16.         };  
  17.         websocket.onclose = function (evt) {  
  18.             //已經關閉連接  
  19.             alert("已經關閉連接");  
  20.         };  
  21.         websocket.onmessage = function (evt) {  
  22.             //收到服務器消息,使用evt.data提取  
  23.             evt.stopPropagation()  
  24.             evt.preventDefault()  
  25.             //alert(evt.data);  
  26.             writeToScreen(evt.data);  
  27.             //websocket.close();  
  28.         };  
  29.         websocket.onerror = function (evt) {  
  30.             //產生異常  
  31.             //alert(evt.message);  
  32.             writeToScreen(evt.message);  
  33.         };  
  34.         function sendMsg() {  
  35.             if (websocket.readyState == websocket.OPEN) {  
  36.                 msg = document.getElementById("msg").value;  
  37.                 websocket.send(msg);  
  38.                 writeToScreen("發送成功!");  
  39.             } else {  
  40.                 writeToScreen("連接失敗!");  
  41.             }  
  42.         }  
  43.  
  44.         function writeToScreen(message) {  
  45.             var pre = document.createElement("p");  
  46.             pre.style.wordWrap = "break-word";  
  47.             pre.innerHTML += message;  
  48.             output.appendChild(pre);  
  49.         }  
  50.     </script> 
  51. </head> 
  52. <body> 
  53.     <div> 
  54.         <input type="text" id="msg" value="beyond is number one!" /> 
  55.         <button onclick="sendMsg()">send</button> 
  56.     </div> 
  57.     <div id="output"></div> 
  58. </body> 
  59. </html> 

readyState表示連接有四種狀態:

CONNECTING (0):表示還沒建立連接;

OPEN (1): 已經建立連接,可以進行通訊;

CLOSING (2):通過關閉握手,正在關閉連接;

CLOSED (3):連接已經關閉或無法打開;

url是代表 WebSocket 服務器的網絡地址,協議通常是”ws”或“wss(加密通信)”,send 方法就是發送數據到服務器端;

close 方法就是關閉連接;

onopen連接建立,即握手成功觸發的事件;

onmessage收到服務器消息時觸發的事件;

onerror異常觸發的事件;

onclose關閉連接觸發的事件;

先說說基于.NET4.5的吧 ashx里面應該是這樣寫的

  1.       //得到當前WebSocket請求  
  2.             HttpContext.Current.AcceptWebSocketRequest(async (context) =>  
  3.             {  
  4.                 WebSocket socket = context.WebSocket;//Socket  
  5.                 while (true)  
  6.                 {  
  7.                     ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);  
  8.                     CancellationToken token;  
  9.                     WebSocketReceiveResult result =  
  10.                             await socket.ReceiveAsync(buffer, token);  
  11.                     if (socket.State == WebSocketState.Open)  
  12.                     {  
  13.                         string userMessage = Encoding.UTF8.GetString(buffer.Array, 0,  
  14.                                 result.Count);  
  15.                         userMessage = "You sent: " + userMessage + " at " +  
  16.                                 DateTime.Now.ToLongTimeString();  
  17.                         buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMessage));  
  18.                         await socket.SendAsync(buffer, WebSocketMessageType.Text,  
  19.                                 true, CancellationToken.None);  
  20.                     }  
  21.                     else { break; }  
  22.                 }  
  23.             }); 

然后需要注意的是 部署到IIS8上面  轉到 Windows程序和功能 -打開Windows功能里面 IIS選項啟動4.5 和WebSocket支持  否則會報錯誤的。

如果你不是Windows8 或者IIS的問題 你可以使用其他方式實現websocket服務器 比如.net socket模擬(因為websocket本身就是基于TCP的完全可以模擬只是規則特別..)

網上有人寫了下面一段

  1. class Program  
  2.   {  
  3.       static void Main(string[] args)  
  4.       {  
  5.           int port = 1818;  
  6.           byte[] buffer = new byte[1024];  
  7.  
  8.           IPEndPoint localEP = new IPEndPoint(IPAddress.Any, port);  
  9.           Socket listener = new Socket(localEP.Address.AddressFamily,SocketType.Stream, ProtocolType.Tcp);  
  10.             
  11.           try{  
  12.               listener.Bind(localEP);  
  13.               listener.Listen(10);  
  14.  
  15.               Console.WriteLine("等待客戶端連接....");  
  16.               Socket sc = listener.Accept();//接受一個連接  
  17.               Console.WriteLine("接受到了客戶端:"+sc.RemoteEndPoint.ToString()+"連接....");  
  18.                 
  19.               //握手  
  20.               int length = sc.Receive(buffer);//接受客戶端握手信息  
  21.               sc.Send(PackHandShakeData(GetSecKeyAccetp(buffer,length)));  
  22.               Console.WriteLine("已經發送握手協議了....");  
  23.                 
  24.               //接受客戶端數據  
  25.               Console.WriteLine("等待客戶端數據....");  
  26.               length = sc.Receive(buffer);//接受客戶端信息  
  27.               string clientMsg=AnalyticData(buffer, length);  
  28.               Console.WriteLine("接受到客戶端數據:" + clientMsg);  
  29.  
  30.               //發送數據  
  31.               string sendMsg = "您好," + clientMsg;  
  32.               Console.WriteLine("發送數據:“"+sendMsg+"” 至客戶端....");  
  33.               sc.Send(PackData(sendMsg));  
  34.                 
  35.               Console.WriteLine("演示Over!");  
  36.  
  37.           }  
  38.           catch (Exception e)  
  39.           {  
  40.               Console.WriteLine(e.ToString());  
  41.           }  
  42.       }  
  43.  
  44.       /// <summary>  
  45.       /// 打包握手信息  
  46.       /// </summary>  
  47.       /// <param name="secKeyAccept">Sec-WebSocket-Accept</param>  
  48.       /// <returns>數據包</returns>  
  49.       private static byte[] PackHandShakeData(string secKeyAccept)  
  50.       {  
  51.           var responseBuilder = new StringBuilder();  
  52.           responseBuilder.Append("HTTP/1.1 101 Switching Protocols" + Environment.NewLine);  
  53.           responseBuilder.Append("Upgrade: websocket" + Environment.NewLine);  
  54.           responseBuilder.Append("Connection: Upgrade" + Environment.NewLine);  
  55.           responseBuilder.Append("Sec-WebSocket-Accept: " + secKeyAccept + Environment.NewLine + Environment.NewLine);  
  56.           //如果把上一行換成下面兩行,才是thewebsocketprotocol-17協議,但居然握手不成功,目前仍沒弄明白!  
  57.           //responseBuilder.Append("Sec-WebSocket-Accept: " + secKeyAccept + Environment.NewLine);  
  58.           //responseBuilder.Append("Sec-WebSocket-Protocol: chat" + Environment.NewLine);  
  59.  
  60.           return Encoding.UTF8.GetBytes(responseBuilder.ToString());  
  61.       }  
  62.  
  63.       /// <summary>  
  64.       /// 生成Sec-WebSocket-Accept  
  65.       /// </summary>  
  66.       /// <param name="handShakeText">客戶端握手信息</param>  
  67.       /// <returns>Sec-WebSocket-Accept</returns>  
  68.       private static string GetSecKeyAccetp(byte[] handShakeBytes,int bytesLength)  
  69.       {  
  70.           string handShakeText = Encoding.UTF8.GetString(handShakeBytes, 0, bytesLength);  
  71.           string key = string.Empty;  
  72.           Regex r = new Regex(@"Sec\-WebSocket\-Key:(.*?)\r\n");  
  73.           Match m = r.Match(handShakeText);  
  74.           if (m.Groups.Count != 0)  
  75.           {  
  76.               key = Regex.Replace(m.Value, @"Sec\-WebSocket\-Key:(.*?)\r\n""$1").Trim();  
  77.           }  
  78.           byte[] encryptionString = SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(key + "258EAFA5-E914-47DA-95CA-C***B0DC85B11"));  
  79.           return Convert.ToBase64String(encryptionString);  
  80.       }  
  81.  
  82.       /// <summary>  
  83.       /// 解析客戶端數據包  
  84.       /// </summary>  
  85.       /// <param name="recBytes">服務器接收的數據包</param>  
  86.       /// <param name="recByteLength">有效數據長度</param>  
  87.       /// <returns></returns>  
  88.       private static string AnalyticData(byte[] recBytes, int recByteLength)  
  89.       {  
  90.           if (recByteLength < 2) { return string.Empty; }  
  91.  
  92.           bool fin = (recBytes[0] & 0x80) == 0x80; // 1bit,1表示***一幀    
  93.           if (!fin){  
  94.               return string.Empty;// 超過一幀暫不處理   
  95.           }  
  96.  
  97.           bool mask_flag = (recBytes[1] & 0x80) == 0x80; // 是否包含掩碼    
  98.           if (!mask_flag){  
  99.               return string.Empty;// 不包含掩碼的暫不處理  
  100.           }  
  101.  
  102.           int payload_len = recBytes[1] & 0x7F; // 數據長度    
  103.  
  104.           byte[] masks = new byte[4];  
  105.           byte[] payload_data;  
  106.  
  107.           if (payload_len == 126){  
  108.               Array.Copy(recBytes, 4, masks, 0, 4);  
  109.               payload_len = (UInt16)(recBytes[2] << 8 | recBytes[3]);  
  110.               payload_data = new byte[payload_len];  
  111.               Array.Copy(recBytes, 8, payload_data, 0, payload_len);  
  112.  
  113.           }else if (payload_len == 127){  
  114.               Array.Copy(recBytes, 10, masks, 0, 4);  
  115.               byte[] uInt64Bytes = new byte[8];  
  116.               for (int i = 0; i < 8; i++){  
  117.                   uInt64Bytes[i] = recBytes[9 - i];  
  118.               }  
  119.               UInt64 len = BitConverter.ToUInt64(uInt64Bytes, 0);  
  120.  
  121.               payload_data = new byte[len];  
  122.               for (UInt64 i = 0; i < len; i++){  
  123.                   payload_data[i] = recBytes[i + 14];  
  124.               }  
  125.           }else{  
  126.               Array.Copy(recBytes, 2, masks, 0, 4);  
  127.               payload_data = new byte[payload_len];  
  128.               Array.Copy(recBytes, 6, payload_data, 0, payload_len);  
  129.  
  130.           }  
  131.  
  132.           for (var i = 0; i < payload_len; i++){  
  133.               payload_data[i] = (byte)(payload_data[i] ^ masks[i % 4]);  
  134.           }  
  135.             
  136.           return Encoding.UTF8.GetString(payload_data);  
  137.       }  
  138.  
  139.  
  140.       /// <summary>  
  141.       /// 打包服務器數據  
  142.       /// </summary>  
  143.       /// <param name="message">數據</param>  
  144.       /// <returns>數據包</returns>  
  145.       private static byte[] PackData(string message)  
  146.       {  
  147.           byte[] contentBytes = null;  
  148.           byte[] temp = Encoding.UTF8.GetBytes(message);  
  149.  
  150.           if (temp.Length < 126){  
  151.               contentBytes = new byte[temp.Length + 2];  
  152.               contentBytes[0] = 0x81;  
  153.               contentBytes[1] = (byte)temp.Length;  
  154.               Array.Copy(temp, 0, contentBytes, 2, temp.Length);  
  155.           }else if (temp.Length < 0xFFFF){  
  156.               contentBytes = new byte[temp.Length + 4];  
  157.               contentBytes[0] = 0x81;  
  158.               contentBytes[1] = 126;  
  159.               contentBytes[2] = (byte)(temp.Length & 0xFF);  
  160.               contentBytes[3] = (byte)(temp.Length >> 8 & 0xFF);  
  161.               Array.Copy(temp, 0, contentBytes, 4, temp.Length);  
  162.           }else{  
  163.               // 暫不處理超長內容    
  164.           }  
  165.  
  166.           return contentBytes;  
  167.       }    
  168.   } 

或者參考這里

ok! 基本上能實現傳輸文字了,接下來是圖像 可以通過base64編碼的方式傳輸 也可以通過二進制傳輸

#p#

HTML5的Canvas 可以實現繪圖 然后應該是這樣寫的

  1. <!DOCTYPE html> 
  2. <html xmlns="http://www.w3.org/1999/xhtml"> 
  3. <head> 
  4.     <title></title> 
  5. </head> 
  6. <body> 
  7.     <div> 
  8.         <input type="text" id="msg" value="beyond is number one!" /> 
  9.         <button onclick="sendMsg()">走你~</button> 
  10.     </div> 
  11.     <canvas id="myCanvas" style="width: 400px; height: 500px;"></canvas> 
  12.     <div id="output"></div> 
  13.     <script type="text/javascript"> 
  14.         var wsServer = 'ws://192.168.10.242:9999/webSocket.ashx'; //服務器地址  
  15.         //var wsServer = 'ws://localhost:36027/webSocket.ashx'; //服務器地址  
  16.         var canvas = document.getElementById("myCanvas");  
  17.         var context = canvas.getContext("2d");  
  18.         var websocket = new WebSocket(wsServer); //創建WebSocket對象  
  19.         websocket.onopen = function (evt) {  
  20.             //已經建立連接  
  21.             alert("已經建立連接");  
  22.         };  
  23.         websocket.onclose = function (evt) {  
  24.             //已經關閉連接  
  25.             //alert("已經關閉連接");  
  26.             writeToScreen("連接關閉");  
  27.         };  
  28.         websocket.onmessage = function (evt) {  
  29.             //收到服務器消息,使用evt.data提取  
  30.             var image = new Image();  
  31.             image.onload = function () {  
  32.                 //image.height  
  33.                 context.clearRect(0, 0,  
  34.                    canvas.width, canvas.height);  
  35.                 context.drawImage(image, 0, 0, canvas.width, canvas.height);  
  36.             }  
  37.             image.src = URL.createObjectURL(evt.data);  
  38.         };  
  39.         websocket.onerror = function (evt) {  
  40.             //產生異常  
  41.             writeToScreen(evt.message);  
  42.         };  
  43.         function sendMsg() {  
  44.             if (websocket.readyState == websocket.OPEN) {  
  45.                 msg = document.getElementById("msg").value;  
  46.                 websocket.send(msg);  
  47.                 writeToScreen("發送成功!");  
  48.             } else {  
  49.                 writeToScreen("連接失敗!");  
  50.             }  
  51.         }  
  52.  
  53.         function writeToScreen(message) {  
  54.             var pre = document.createElement("p");  
  55.             pre.style.wordWrap = "break-word";  
  56.             pre.innerHTML += message;  
  57.             output.appendChild(pre);  
  58.         }  
  59.     </script> 
  60. </body> 
  61. </html> 

通過   context.drawImage(image, 0, 0, canvas.width, canvas.height); 來繪制圖像

websocket接到數據后通過

image.src = URL.createObjectURL(evt.data);轉換成圖片對象

ok 這樣能實現接收圖片了,然后服務端發送的時候

  1. //Buffer里面為你的圖片數據 你可以通過文件流的方式來打開  
  2. await socket.SendAsync(buffer, WebSocketMessageType.Binary,true, CancellationToken.None);  
  3. //注意此時WebSocketMessageType 為Binary二進制流 

然后我實現了一個 讀取本地文件夾 每隔1秒發送圖片給網頁的服務端 

部分代碼如下

  1.  string imgPath = HttpContext.Current.Server.MapPath("images");  
  2.                string[] files = Directory.GetFiles(imgPath);  
  3. for (int i = 0; i < files.Length; i++)  
  4.                        {  
  5.                            using (FileStream fs = new FileStream(files[i], FileMode.Open))  
  6.                            {  
  7.                                byte[] imgData = new byte[fs.Length];  
  8.                                fs.Read(imgData, 0, imgData.Length);  
  9.                                //buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMessage));  
  10.                                buffer = new ArraySegment<byte>(imgData);  
  11.                                // Asynchronously send a message to the client  
  12.                                await socket.SendAsync(buffer, WebSocketMessageType.Binary,  
  13.                                        true, CancellationToken.None);  
  14.                                Thread.Sleep(1000);  
  15.                            }  
  16.                            if (i == files.Length - 1)  
  17.                                i = 0;  
  18.                        } 

這樣圖像傳輸解決了,然后實現套接字 就可以傳輸實時圖片了。

我做了一個Windows Phone的客戶端不斷的采集圖片發送給服務器 然后服務器接到圖片發送給瀏覽器的Demo 就不貼代碼了 上圖!

(這張圖是在Windows Phone模擬器里面的IE瀏覽器上 證明了 它支持WebSocket)

(Windows 上的客戶端 ^.^ Windows Phone Windows 8都能的 )

上面說的僅僅是簡單的演示程序 距離做項目還差的很遠,寫這篇文章為的是給大家一個信心... Windows 8&Windows Phone也可以的...

原文鏈接:http://www.cnblogs.com/beyondblog/archive/2013/04/11/3015756.html

責任編輯:張偉 來源: 博客園
相關推薦

2023-11-17 09:35:58

2024-09-02 09:31:19

2023-11-26 09:10:34

WebSocketgreeting?在線用戶

2017-09-22 11:45:10

深度學習OpenCVPython

2024-06-12 08:46:19

2025-07-01 07:34:03

2010-03-26 11:13:11

2012-12-25 09:36:11

Storm大數據分析

2020-06-10 21:56:53

醫療物聯網IOT

2022-12-06 15:59:14

人工智能

2015-06-16 16:49:25

AWSKinesis實時數據處理

2024-05-17 08:07:46

Spring廣告推薦系統

2025-06-16 04:00:00

Spring彈幕技術

2025-07-21 05:00:00

2012-09-04 09:23:45

HTML5消息傳輸傳輸機制

2015-11-06 14:45:28

2009-07-14 08:51:59

HTML 5視頻標準

2012-05-16 19:06:04

2010-01-21 13:34:31

HTML 5Youtube

2012-05-30 10:26:23

HTML5
點贊
收藏

51CTO技術棧公眾號

国产日韩欧美视频在线| 国产亚洲精品久久久久动| 久久久性生活视频| 免费在线稳定资源站| 琪琪一区二区三区| 久久影视电视剧免费网站清宫辞电视 | 91精品秘密在线观看| 欧美精品一区二区三区高清aⅴ| 一本大道熟女人妻中文字幕在线| 日韩精品成人av| 99精品久久免费看蜜臀剧情介绍| 国产日韩av高清| 黄色片免费观看视频| 婷婷亚洲五月| 亚洲日韩中文字幕| 黄色在线免费播放| 四虎精品一区二区免费| 精品久久久久久久久久久久久久| 亚洲欧美在线网| 欧美性孕妇孕交| 国产91精品在线观看| 国产精品视频一区二区高潮| 国产精品一区二区6| 国产精品二区不卡| 在线精品国产成人综合| 中文字幕在线播放视频| 国内精品视频| 欧美日韩精品二区第二页| 黑人糟蹋人妻hd中文字幕| 欧洲在线视频| 亚洲婷婷综合久久一本伊一区| 久久99精品国产99久久| 国产成人自拍一区| 国产精品亚洲综合一区在线观看| 国产精品久久久久久久久久尿| 日韩三级免费看| 国产精品vip| 久久影视免费观看| 亚洲区一区二区三| 手机亚洲手机国产手机日韩| 国产小视频国产精品| 久久久亚洲av波多野结衣| 99a精品视频在线观看| 欧美一级精品在线| 热久久久久久久久| 日本免费成人| 欧美日韩大陆一区二区| www.这里只有精品| 欧美91在线|欧美| 欧美日韩视频免费播放| 免费国产a级片| 黄色aa久久| 婷婷久久综合九色国产成人| 久久久性生活视频| 亚洲美女炮图| 91成人国产精品| 丰满少妇在线观看| 久久不卡日韩美女| 91精品国产综合久久婷婷香蕉 | 无码人妻精品一区二区三区66| sm捆绑调教国产免费网站在线观看| 亚洲国产精品一区二区www | 日韩精品久久一区二区三区| 成人综合影院| 中文字幕在线免费不卡| 黄瓜视频免费观看在线观看www| 免费在线毛片网站| 一区二区三区在线影院| 欧美一级视频在线播放| 成人香蕉视频| 欧美日韩三级视频| 粗大的内捧猛烈进出视频| 好吊妞国产欧美日韩免费观看网站| 亚洲电影免费观看高清完整版在线观看 | 国产日韩欧美亚洲| 日韩人妻精品一区二区三区| 大黄网站在线观看| 日韩欧美国产高清91| 欧美美女性视频| 日本精品在线播放 | 97人人模人人爽人人少妇| 国产xxxxxx| 91久色porny| 一区二区三区三区在线| 黑人精品视频| 91黄色激情网站| 国产成年人视频网站| 大奶一区二区三区| 亚洲午夜色婷婷在线| 国产大学生自拍| 久久久蜜桃一区二区人| 国产一区二区视频在线观看| 国模私拍视频在线| 国产精品视频第一区| 国产精品视频网站在线观看| se01亚洲视频| 精品国产乱码久久久久久免费| 一区二区三区四区免费| 中文字幕一区二区三三| 欧洲精品久久久| 精品久久久无码中文字幕| 国产亚洲美州欧州综合国| 91午夜在线观看| 成人自拍视频网| 亚洲精美色品网站| 四虎永久免费在线| 视频在线观看一区| 国产伦精品一区二区三区照片| 国产69久久| 午夜精品久久久久久久99樱桃| 天堂av8在线| 国产精品自拍区| 久久久久久一区二区三区| 中文字幕日韩国产| 91免费视频网| 亚洲人成无码网站久久99热国产| 久久亚洲资源中文字| 日韩精品在线视频观看| 久久97人妻无码一区二区三区| 男女性色大片免费观看一区二区| 久久国产欧美精品| 蜜臀av在线播放| 91精品婷婷国产综合久久性色| 中文字幕国产专区| 一区二区日本视频| 粉嫩av一区二区三区免费观看| 色影院视频在线| 日本丶国产丶欧美色综合| 亚洲一区二区在线免费| 海角社区69精品视频| 国产在线日韩在线| 69久久夜色| 欧洲视频一区二区| 欧美大波大乳巨大乳| 国产欧美另类| 久久久一本精品99久久精品| 操喷在线视频| 精品1区2区在线观看| 激情五月婷婷在线| 国产成人精品亚洲午夜麻豆| 女同性恋一区二区| 日韩一区二区三区精品| 欧美大成色www永久网站婷| 国产视频手机在线观看| 最近中文字幕一区二区三区| 亚洲人视频在线| 婷婷综合伊人| 91在线观看免费网站| 羞羞网站在线看| 精品欧美一区二区三区精品久久 | 久久精品一区二区免费播放| 亚洲欧美日本视频在线观看| 免费在线成人av电影| 电影亚洲精品噜噜在线观看| 国产亚洲精品美女久久久| 免费一级a毛片| 国产精品私房写真福利视频| 奇米影音第四色| 最新精品国产| 国产伦视频一区二区三区| 97蜜桃久久| 亚洲欧美在线第一页| 最近日韩免费视频| 亚洲视频网在线直播| 男插女视频网站| 最新亚洲视频| 日韩亚洲视频| 国产亚洲字幕| 97视频在线观看免费高清完整版在线观看| 国精产品一品二品国精品69xx| 婷婷六月综合网| 国产真人做爰视频免费| 国产在线精品免费| 男人日女人视频网站| 精品国产乱码久久久久久蜜坠欲下 | www.99re7.com| 久久婷婷国产综合精品青草| 美女网站色免费| 欧美日韩91| 欧美在线视频一区二区三区| 久久影视精品| 国内精品一区二区三区| 成在在线免费视频| 欧美精品一区二区三区久久久| 天天爱天天做天天爽| 亚洲欧美激情视频在线观看一区二区三区| 亚洲熟女一区二区三区| 天堂精品中文字幕在线| 999久久欧美人妻一区二区| 亚洲+变态+欧美+另类+精品| 成人精品一区二区三区电影免费| 91超碰在线| 久久亚洲综合国产精品99麻豆精品福利 | 在线免费观看亚洲视频| 久久综合成人精品亚洲另类欧美 | 一区二区在线观看免费视频播放 | 中文字幕亚洲区| 熟妇人妻久久中文字幕| 激情成人午夜视频| 成人精品视频一区二区| 国产精品theporn| 一区二区精品在线观看| 九九视频免费观看视频精品 | 午夜一区二区视频| 在线亚洲国产精品网站| 女同性恋一区二区| 成人高清电影网站| 精品免费国产| 日韩免费成人| 国产精品亚洲欧美导航| 欧美大胆成人| 久久久中文字幕| 91精品久久| 三级精品视频久久久久| 亚洲av片一区二区三区| 日韩一级片网址| 亚洲天堂网视频| 91久久精品国产91性色tv| 国产精彩视频在线| 夜夜爽夜夜爽精品视频| 免费成人深夜夜行网站| 亚洲国产精华液网站w| 中文人妻一区二区三区| 99综合电影在线视频| 中国特级黄色片| 国产精品系列在线播放| 三级一区二区三区| 精品一区二区影视| 日本不卡一区在线| 日本免费新一区视频| 成人小视频在线看| 久久精品一本| 成人在线免费在线观看 | 日韩欧美国产片| 蜜臀av亚洲一区中文字幕| 91激情视频在线| 日本亚洲免费观看| 亚洲视频在线观看一区二区三区| 老司机一区二区三区| 国产黄色特级片| 丝袜美腿成人在线| 国产一级特黄a大片免费| 日韩高清不卡一区二区| 欧美精品成人网| 日韩精品久久理论片| 五月婷婷狠狠操| 奇米精品一区二区三区四区| 一区二区三区韩国| 久久福利视频一区二区| 亚洲精品免费一区亚洲精品免费精品一区| 日本一不卡视频| 欧美一级视频在线| 国产成人在线视频网址| 一级片黄色免费| 国产精品88888| 中文字幕免费在线播放| 91欧美一区二区| 91视频免费在观看| 亚洲欧美综合色| 久久久久久激情| 狠狠操狠狠色综合网| 波多野结衣不卡| 91精品在线一区二区| 亚洲xxx在线| 日韩精品久久久久久福利| 国产精品久久久久一区二区国产| 社区色欧美激情 | 羞羞的视频在线看| 欧美一级淫片播放口| 日本一区二区三区视频在线| 91偷拍与自偷拍精品| 少妇免费毛片久久久久久久久| 日本视频久久久| 色999韩欧美国产综合俺来也| 亚洲精品免费网站| 欧美美女啪啪| 香蕉久久夜色| 激情久久久久久| 国产v亚洲v天堂无码久久久 | 国产不卡在线观看| 日韩色性视频| 精品一卡二卡三卡四卡日本乱码| 精品久久久亚洲| 日本一道在线观看| 欧美一级专区| 欧洲成人午夜精品无码区久久| 久久综合久色欧美综合狠狠| 人人干在线观看| 欧美色视频日本高清在线观看| 一区二区视频免费| 亚洲精品一区在线观看| av在线免费一区| 国内精品400部情侣激情| 日韩av电影资源网| 国产成人免费电影| 日韩在线第七页| 成人免费aaa| 国产伦理精品不卡| 91激情视频在线观看| 亚洲一区二区三区国产| 伊人久久亚洲综合| 日韩经典中文字幕在线观看| 成人ww免费完整版在线观看| 国产不卡一区二区在线播放| 操欧美女人视频| 中国成人在线视频| 久久久久国产精品午夜一区| 激情av中文字幕| 日韩美女视频一区二区| 成人一级免费视频| 日韩av中文在线| 秋霞在线视频| 91久久国产婷婷一区二区| 少妇精品久久久一区二区三区| 农民人伦一区二区三区| 国产一区二区三区在线观看精品| 真实乱视频国产免费观看| 午夜激情久久久| 丰满人妻一区二区三区四区53| 综合网日日天干夜夜久久| 综合毛片免费视频| 精品亚洲欧美日韩| 亚洲国产精品一区制服丝袜| 精品国产午夜福利在线观看| 国产精品护士白丝一区av| 亚洲欧美日韩一区二区三区四区| 亚洲剧情一区二区| 老色鬼在线视频| 国产欧美一区二区视频| 欧美视频四区| 国产成人av片| 亚洲大尺度视频在线观看| www.成人免费视频| 欧美日韩电影在线观看| 玖玖精品一区| 国产av熟女一区二区三区| 国产中文字幕精品| 我要看黄色一级片| 91精品黄色片免费大全| 日本小视频在线免费观看| 亚洲最大成人网色| 中文字幕亚洲综合久久五月天色无吗''| 国产无遮挡猛进猛出免费软件 | 精品美女一区| 日韩影视精品| 毛片基地黄久久久久久天堂| 久久亚洲无码视频| 欧美性做爰猛烈叫床潮| av在线免费一区| 91亚洲精品在线观看| 欧美久久综合| 久久久久麻豆v国产精华液好用吗| 亚洲va国产天堂va久久en| 亚洲av成人无码网天堂| 国产91九色视频| 日韩大片在线观看| 国产精品久久久久久久av福利| 亚洲手机成人高清视频| 亚洲精品视频91| 2019最新中文字幕| 欧美日韩国产传媒| 午夜福利123| 亚洲一区二区三区中文字幕| 日韩黄色影片| 国产精品一区二区三区成人| 91精品推荐| 在线免费观看污视频| 一本色道久久综合亚洲精品按摩| 成年人视频在线观看免费| 91免费精品国偷自产在线| 亚洲激情网址| 日韩中文字幕有码| 欧美一级日韩一级| 久久久男人天堂| 亚洲国产激情一区二区三区| 国产美女精品人人做人人爽| 国产一级做a爰片在线看免费| 亚洲精品视频免费| 国产精品3区| 亚洲中文字幕无码专区| 国产精品女主播av| 成人毛片视频免费看| 国产成人精品电影久久久| 91超碰成人| 丰满少妇一区二区| 欧美一卡二卡在线观看| 欧美7777| 黄网站色视频免费观看| 久久精品一区四区| 亚洲精品久久久蜜桃动漫| 国产精品久久久久久久av大片| 欧美xxx在线观看| 亚洲精品国产91| 精品人在线二区三区| 日本国产亚洲| 日本三区在线观看| 香蕉影视欧美成人| 欧美私人网站| 欧美一进一出视频| 成人久久18免费网站麻豆|