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

幾行代碼,擼了個(gè) 元宇宙?!

開發(fā) 前端
Facebook 改名為 meta,一下子點(diǎn)燃了 元宇宙 這個(gè)概念。今天我就用 Python 實(shí)現(xiàn)一個(gè)簡單的迷你元宇宙。代碼簡潔易懂,不僅可以學(xué)習(xí) Python 知識(shí),還能用實(shí)踐理解元宇宙的概念。

[[439939]]

Facebook 改名為 meta,一下子點(diǎn)燃了 元宇宙 這個(gè)概念。

今天我就用 Python 實(shí)現(xiàn)一個(gè)簡單的迷你元宇宙。

代碼簡潔易懂,不僅可以學(xué)習(xí) Python 知識(shí),還能用實(shí)踐理解元宇宙的概念。

還等什么,現(xiàn)在就開始吧!

迷你元宇宙

什么是元宇宙?

不同的人有不同的理解和認(rèn)識(shí),最能達(dá)成共識(shí)的是:

元宇宙是個(gè)接入點(diǎn),每個(gè)人都可以成為其中的一個(gè)元素,彼此互動(dòng)。

那么我們的元宇宙有哪些功能呢?

首先必須有可以接入的功能。

然后彼此之間可以交流信息。比如 a 發(fā)消息給 b,b 可以發(fā)消息給 a,同時(shí)可以將消息廣播出去,也就是成員之間,可以私信 和 群聊。

另外,在元宇宙的成員可以收到元宇宙的動(dòng)態(tài),比如新人加入,或者有人離開等,如果玩膩了,可以離開元宇宙。

最終的效果像這樣:

效果

設(shè)計(jì)

如何構(gòu)建接入點(diǎn)

直接思考可能比較困難,換個(gè)角度想,接入點(diǎn)其實(shí)就是 —— 服務(wù)器。

只要是上網(wǎng),每時(shí)每刻,我們都是同服務(wù)器打交的。

那就選擇最簡單的 TCP 服務(wù)器,TCP 服務(wù)器的核心是維護(hù)套接字(socket)的狀態(tài),向其中發(fā)送或者獲取信息。

python 的 socket 庫,提供了很多有關(guān)便捷方法,可以幫助我們構(gòu)建。

核心代碼如下:

  1. import socket 
  2.  
  3. socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  4. socket.bind((ip, port)) 
  5. socket.listen() 
  6.  
  7. data = socket.recv(1024) 
  8. ... 

創(chuàng)建一個(gè) socket,讓其監(jiān)聽機(jī)器所擁有的一個(gè) ip 和 端口,然后從 socket 中讀取發(fā)送過來的數(shù)據(jù)。

如何構(gòu)建客戶端

客戶端是為了方便用戶鏈接到元宇宙的工具,這里,就是能鏈接到服務(wù)器的工具,服務(wù)器是 TCP 服務(wù)器,客戶端自然需要用可以鏈接 TCP 服務(wù)器的方式。

python 也已為我們備好,幾行代碼就可以搞定,核心代碼如下:

  1. import socket 
  2.  
  3. client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
  4. client.connect((ip, port)) 
  5.  
  6. data = client.recv(1024) 
  7. ... 

代碼與服務(wù)器很像,不過去鏈接一個(gè)服務(wù)器的 ip 和 端口。

如何構(gòu)建業(yè)務(wù)邏輯

首先需要讓服務(wù)器將接入的用戶管理起來。

然后當(dāng)接收到用戶消息時(shí)做出判斷,是轉(zhuǎn)發(fā)給其他用戶,廣播還是做出回應(yīng)。

這樣就需要構(gòu)造一種消息格式,用來表示用戶消息的類型或者目的。

我們就用 @username 的格式來區(qū)分,消息發(fā)給特殊用戶還是群發(fā)。

另外,為了完成注冊(cè)功能,需要再定義一種命令格式,用于設(shè)置 username,我們可以用 name:username 的格式作為設(shè)置用戶名的命令。

構(gòu)建

有了初步設(shè)計(jì),就可以進(jìn)一步構(gòu)建我們的代碼了。

服務(wù)端

服務(wù)器需要同時(shí)響應(yīng)多個(gè)鏈接,其中包括新鏈接創(chuàng)建,消息 和 鏈接斷開 等。

為了不讓服務(wù)器阻塞,我們采用非阻塞的鏈接,當(dāng)鏈接接入時(shí),將鏈接存儲(chǔ)起來,然后用 select 工具,等待有了消息的鏈接。

這個(gè)功能,已經(jīng)有人實(shí)現(xiàn)好了 simpletcp[1],只要稍作改動(dòng)就好。

將其中的收到消息,建立鏈接,關(guān)閉鏈接做成回調(diào)方法,以便再外部編寫業(yè)務(wù)邏輯。

核心業(yè)務(wù)

這里說明一下核心代碼:

  1. # 創(chuàng)建一個(gè)服務(wù)器鏈接 
  2. self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  3. self._socket.setblocking(0) 
  4. self._socket.bind((self.ip, self.port)) 
  5. self._socket.listen(self._max_connections) 
  6.  
  7. # 存放已建立的鏈接 
  8. readers = [self._socket] 
  9. # 存放客戶端 ip和端口 
  10. IPs = dict() 
  11.  
  12. # 退出標(biāo)記 用于關(guān)閉服務(wù)器 
  13. self._stop = False 
  14.  
  15. # 服務(wù)器主循環(huán) 
  16. while readers and not self._stop: 
  17.     # 利用 select 從 建立的鏈接中選取一些有新消息的 
  18.     read, _, err = select.select(readers, [], readers) 
  19.      
  20.     for sock in read
  21.         if sock is self._socket: 
  22.             # 建立了新鏈接 
  23.  
  24.             # 獲取新鏈接的 socket 以及 ip和端口 
  25.             client_socket, client_ip = self._socket.accept() 
  26.              
  27.             # 將鏈接設(shè)置為非阻塞的 
  28.             client_socket.setblocking(0) 
  29.             # 添加到監(jiān)聽隊(duì)列 
  30.             readers.append(client_socket) 
  31.             # 存儲(chǔ)ip信息 
  32.             IPs[client_socket] = client_ip 
  33.  
  34.             # 調(diào)用建立鏈接回調(diào)函數(shù) 
  35.             self.onCreateConn(self, client_socket, client_ip) 
  36.         else
  37.             # 收到了新消息 
  38.             try: 
  39.                 # 獲取消息 
  40.                 data = sock.recv(self.recv_bytes) 
  41.             except socket.error as e: 
  42.                 if e.errno == errno.ECONNRESET: 
  43.                     # 表明鏈接已退出 
  44.                     data = None 
  45.                 else
  46.                     raise e 
  47.             if data: 
  48.                 # 調(diào)用收到消息回調(diào)函數(shù) 
  49.                 self.onReceiveMsg(self, sock, IPs[sock], data) 
  50.             else
  51.                 # 鏈接退出時(shí),移除監(jiān)聽隊(duì)列 
  52.                 readers.remove(sock) 
  53.                 sock.close() 
  54.  
  55.                 # 調(diào)用鏈接關(guān)閉回調(diào)函數(shù) 
  56.                 self.onCloseConn(self, sock, IPs[sock])          
  57.     # 處理存在錯(cuò)誤的鏈接 
  58.     for sock in err: 
  59.         # 移除監(jiān)聽隊(duì)列 
  60.         readers.remove(sock) 
  61.         sock.close() 
  62.  
  63.         # 調(diào)用鏈接關(guān)閉回調(diào)函數(shù) 
  64.         self.onCloseConn(self, sock, IPs[sock]) 
  • 首先利用 socket 建立一個(gè)服務(wù)器鏈接,這個(gè)和最初的 socket 核心代碼一樣
  • 不同的是設(shè)置鏈接為非阻塞的,這樣就可以通過 select 同時(shí)監(jiān)控多個(gè)鏈接,也不至于阻塞服務(wù)器了。關(guān)于 select 可以看這里[2]
  • 在主循環(huán)中,篩選出有了消息的鏈接,判斷是建立鏈接還是消息發(fā)送,調(diào)用不同的回調(diào)函數(shù)
  • 最后處理一下異常

事件處理

現(xiàn)在通過回調(diào)函數(shù),就可以編寫業(yè)務(wù)了,之間看代碼。

這段是建立鏈接時(shí)的處理:

  1. def onCreateConn(server, sock, ip): 
  2.  
  3. cid = f'{ip[0]}_{ip[1]}' 
  4.  
  5. clients[cid] = {'cid': cid, 'sock': sock, 'name': None} 
  6.  
  7. sock.send("你已經(jīng)接入元宇宙,告訴我你的代號(hào),輸入格式為 name:lily.".encode('utf-8')) 
  • 首先計(jì)算出客戶端 id,即 cid,通過 ip 和 端口 組成
  • clients 是個(gè)詞典,用 cid 為 key,存儲(chǔ)了 cid、鏈接、和名稱
  • 一旦建立起來鏈接,向鏈接發(fā)送一段問候語,并要求其設(shè)置自己的名稱

然后是接收消息的回調(diào)函數(shù),這個(gè)相對(duì)復(fù)雜一些,主要是處理的情況更多:

  1. def onReceiveMsg(server, sock, ip, data): 
  2.     cid = f'{ip[0]}_{ip[1]}' 
  3.     data = data.decode('utf-8'
  4.     print(f"收到數(shù)據(jù): {data}"
  5.     _from = clients[cid] 
  6.     if data.startswith('name:'): 
  7.         # 設(shè)置名稱 
  8.         name = data[5:].strip() 
  9.         if not name
  10.             sock.send(f"不能設(shè)置空名稱,否則其他人找不見你".encode('utf-8')) 
  11.         elif not checkname(name, cid): 
  12.             sock.send(f"這個(gè)名字{name}已經(jīng)被使用,請(qǐng)換一個(gè)試試".encode('utf-8')) 
  13.         else
  14.             if not _from['name']: 
  15.                 sock.send(f"{name} 很高興見到你,現(xiàn)在可以暢游元宇宙了".encode('utf-8')) 
  16.                 msg = f"新成員{name} 加入了元宇宙,和TA聊聊吧".encode('utf-8'
  17.                 sendMsg(msg, _from) 
  18.             else
  19.                 sock.send(f"更換名稱完成".encode('utf-8')) 
  20.                 msg = f"{_from['name']} 更換名稱為 {name},和TA聊聊吧".encode('utf-8'
  21.                 sendMsg(msg, _from) 
  22.             _from['name'] = name 
  23.          
  24.     elif '@' in data: 
  25.         # 私信 
  26.         targets = re.findall(r'@(.+?) ', data) 
  27.         print(targets) 
  28.         msg = f"{_from['name']}: {data}".encode('utf-8'
  29.         sendMsg(msg, _from, targets) 
  30.     else
  31.         # 群信 
  32.         msg = f"{_from['name']}:{data}".encode('utf-8'
  33.         sendMsg(msg, _from) 
  • 代碼分為兩大部分,if 前面是處理收到的消息,將 bytes 轉(zhuǎn)化為 字符串;if 開始處理具體的消息
  • 如果收到 name: 開頭的消息,表示需要設(shè)置用戶名,其中包括判重,以及給其他成員發(fā)送消息
  • 如果收到的消息里有 @,表示在發(fā)私信,先提取出需要發(fā)出的用戶們,然后將消息發(fā)送給對(duì)應(yīng)的用戶
  • 如果沒有特殊標(biāo)記,就表示群發(fā)
  • 其中 sendMsg 用于發(fā)送消息,接收三個(gè)參數(shù),第一個(gè)是消息,第二是發(fā)送者,第三個(gè)是接收者名稱數(shù)組

當(dāng)鏈接關(guān)閉時(shí),需要處理一下關(guān)閉的回調(diào)函數(shù):

  1. def onCloseConn(server, sock, ip): 
  2.     cid = f'{ip[0]}_{ip[1]}' 
  3.     name = clients[cid]['name'
  4.     if name
  5.         msg = f"{name} 從元宇宙中消失了".encode('utf-8'
  6.         sendMsg(msg, clients[cid]) 
  7.     del clients[cid] 
  • 當(dāng)收到鏈接斷開的消息時(shí),合成消息,發(fā)送給其他用戶
  • 然后從客戶端緩存中刪除

客戶端

客戶端需要解決兩個(gè)問題,第一個(gè)是處理接收到的消息,第二個(gè)是允許用戶的輸入。

我們將接收消息作為一個(gè)線程,將用戶輸入作為主循環(huán)。

接收消息

先看接收消息的代碼:

  1. def receive(client): 
  2.     while True
  3.         try: 
  4.             s_info = client.recv(1024)  # 接受服務(wù)端的消息并解碼 
  5.             if not s_info: 
  6.                 print(f"{bcolors.WARNING}服務(wù)器鏈接斷開{bcolors.ENDC}"
  7.                 break 
  8.             print(f"{bcolors.OKCYAN}新的消息:{bcolors.ENDC}\n", bcolors.OKGREEN + s_info.decode('utf-8')+ bcolors.ENDC) 
  9.         except Exception: 
  10.             print(f"{bcolors.WARNING}服務(wù)器鏈接斷開{bcolors.ENDC}"
  11.             break 
  12.         if close
  13.             break 
  • 這是線程中用的代碼,接收一個(gè)客戶端鏈接作為參數(shù)
  • 在循環(huán)中不斷地從鏈接中獲取信息,如果沒有消息時(shí) recv 方法會(huì)阻塞,直到有新的消息過來
  • 收到消息后,將消息寫出到控制臺(tái)上
  • bcolors 提供了一些顏色標(biāo)記,將消息顯示為不同的顏色
  • close 是一個(gè)全局標(biāo)記,如果客戶端需要退出時(shí),會(huì)設(shè)置為 True,可以讓線程結(jié)束

輸入處理

下面再看一下輸入控制程序:

  1. while True
  2.     pass 
  3.     value = input(""
  4.     value = value.strip() 
  5.      
  6.     if value == ':start'
  7.         if thread: 
  8.             print(f"{bcolors.OKBLUE}您已經(jīng)在元宇宙中了{(lán)bcolors.ENDC}"
  9.         else
  10.             client = createClient(ip, 5000) 
  11.             thread = Thread(target=receive, args=(client,)) 
  12.             thread.start() 
  13.             print(f"{bcolors.OKBLUE}您進(jìn)入元宇宙了{(lán)bcolors.ENDC}"
  14.     elif value == ':quit' or value == ':stop'
  15.         if thread: 
  16.             client.close() 
  17.             close = True 
  18.             print(f"{bcolors.OKBLUE}正在退出中…{bcolors.ENDC}"
  19.             thread.join() 
  20.             print(f"{bcolors.OKBLUE}元宇宙已退出{bcolors.ENDC}"
  21.             thread = None 
  22.         if value == ':quit'
  23.             print(f"{bcolors.OKBLUE}退出程序{bcolors.ENDC}"
  24.             break 
  25.         pass 
  26.     elif value == ':help'
  27.         help() 
  28.     else
  29.         if client: 
  30.             # 聊天模式 
  31.             client.send(value.encode('utf-8')) 
  32.         else
  33.             print(f'{bcolors.WARNING}還沒接入元宇宙,請(qǐng)先輸入 :start 接入{bcolors.ENDC}'
  34.     client.close() 
  1. 主要是對(duì)不同的命令做出的相應(yīng),比如 :start 表示需要建立鏈接,:quit 表示退出等
  2. 命令前加 : 是為了和一般的消息做區(qū)分,如果不帶 : 就認(rèn)為是在發(fā)送消息

啟動(dòng)

完成了整體編碼之后,就可以啟動(dòng)了,最終的代碼由三部分組成。

第一部分是服務(wù)器端核心代碼,存放在 simpletcp.py 中。

第二部分是服務(wù)器端業(yè)務(wù)代碼,存放在 metaServer.py 中。

第三部分是客戶端代碼,存放在 metaClient.py 中。

另外需要一些輔助的處理,比如發(fā)送消息的 sendMsg 方法,顏色處理方法等,具體可以下載本文源碼了解。

進(jìn)入代碼目錄,啟動(dòng)命令行,執(zhí)行 python metaServer.py,輸入指令 start:

server

然后再打開一個(gè)命令行,執(zhí)行 python metaClient.py,輸入指令 :start,就可以接入到元宇宙:

client

設(shè)置自己的名字:

如果有新的成員加入時(shí),就會(huì)得到消息提醒, 還可以玩點(diǎn)互動(dòng):

怎么樣好玩吧,一個(gè)元宇宙就這樣形成了,趕緊讓其他伙伴加入試試吧。

總結(jié)

元宇宙現(xiàn)在是個(gè)很熱的概念,但還是基于現(xiàn)有的技術(shù)打造的,元宇宙給人們提供了一個(gè)生活在虛擬的神奇世界里的想象空間,其實(shí)自從有了互聯(lián)網(wǎng),我們就已經(jīng)逐步生活在元宇宙之中了。

今天我們用基礎(chǔ)的 TCP 技術(shù),構(gòu)建了一個(gè)自己的元宇宙聊天室,雖然功能上和想象中的元宇宙相去甚遠(yuǎn),不過其中的主要功能已經(jīng)成形了。

如果有興趣還可以在這個(gè)基礎(chǔ)上加入更好玩的功能,比如好友,群組,消息記錄等等,在深入了解的同時(shí),讓這個(gè)元宇宙更好玩。

期望今天的你們?cè)钪鎸?duì)你有所啟發(fā),歡迎在留言區(qū)寫下你的想法與觀點(diǎn),比心!

參考代碼

https://github.com/JustDoPython/python-examples/tree/master/taiyangxue/meta

參考資料

[1]simpletcp: https://github.com/fschr/simpletcp

[2]select: https://docs.python.org/zh-cn/3/library/select.html

 

責(zé)任編輯:武曉燕 來源: Python技術(shù)
相關(guān)推薦

2021-10-18 09:09:16

數(shù)據(jù)庫

2023-02-03 17:50:29

元宇宙資本

2022-07-06 23:28:53

元宇宙Web3.0

2022-03-13 19:37:13

元宇宙安全隱私

2022-06-27 14:31:20

元宇宙品牌運(yùn)營推廣

2022-06-01 16:13:51

元宇宙

2020-09-10 06:58:34

C語言DBProxy

2022-08-10 23:18:14

元宇宙NFT虛擬世界

2023-06-28 14:37:20

元宇宙工業(yè)元宇宙

2020-04-30 14:25:13

代碼項(xiàng)目JS

2021-07-29 09:29:12

AI游戲DeepMind

2022-07-14 14:05:26

元宇宙區(qū)塊鏈技術(shù)

2022-04-28 13:56:10

元宇宙虛擬交易NFT

2022-06-15 14:37:30

元宇宙

2022-06-29 13:46:50

元宇宙Web 3.0

2022-06-09 17:41:05

Lamina1元宇宙區(qū)塊鏈

2021-12-16 07:49:12

元宇宙VR平行時(shí)空

2021-11-18 11:01:03

元宇宙技術(shù)自動(dòng)化

2021-04-15 11:10:40

GitHub代碼開發(fā)者

2020-02-17 13:45:27

抓取代碼工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

伊人成年综合网| 亚洲AV无码国产成人久久| 亚洲小说区图片区都市| 国产白丝精品91爽爽久久| 午夜精品久久久久久99热软件| yjizz视频| 福利精品一区| 午夜精品一区在线观看| 性欧美精品一区二区三区在线播放| 91国内精品视频| 国产精品久久国产愉拍| 久久精品国产69国产精品亚洲| 欧洲熟妇的性久久久久久| 成人天堂yy6080亚洲高清| 亚洲九九爱视频| 蜜桃视频成人| 亚洲国产www| 日韩高清一区二区| 98精品在线视频| 久久―日本道色综合久久 | 欧美理论电影| 国产欧美一区二区精品性色超碰| 91久久精品一区二区别| 久久久999久久久| 99日韩精品| 欧美激情va永久在线播放| 亚洲av熟女国产一区二区性色 | 欧美日本韩国国产| 亚洲国产剧情在线观看| 麻豆高清免费国产一区| 欧美专区日韩视频| 国产性生活网站| 五月天激情综合网| 正在播放欧美视频| 蜜桃无码一区二区三区| 牛牛视频精品一区二区不卡| 日韩视频一区二区三区在线播放| www亚洲成人| 久久野战av| 日韩欧美极品在线观看| 成人免费播放器| 国内在线视频| 亚洲一二三区视频在线观看| www.黄色网址.com| 在线观看a视频| 国产欧美1区2区3区| 日韩高清dvd| 国产中文字幕在线播放| 久久久久一区二区三区四区| 国模一区二区三区私拍视频| 懂色av成人一区二区三区| 国产成人免费在线视频| 999久久久| 国产三级午夜理伦三级| 国产一区二区久久| 91视频婷婷| 亚洲精品国产suv一区| 国产精品小仙女| 91九色极品视频| 乱精品一区字幕二区| 成人三级伦理片| 精品亚洲一区二区三区四区五区高| 成人免费一级视频| www国产亚洲精品久久麻豆| 久久国产日韩欧美| 黄色网址在线播放| 国产精品私房写真福利视频| 在线亚洲美日韩| 黄色在线观看网站| 亚洲综合一区在线| 久久亚洲中文字幕无码| 欧美7777| 欧美人与性动xxxx| 手机在线观看日韩av| 99久久香蕉| 亚洲免费视频在线观看| 日韩一级av毛片| 久久人体视频| 欧美国产乱视频| 精品国产免费观看| 免费视频一区二区| 91在线精品观看| 手机av在线免费观看| 91老司机福利 在线| 视频在线精品一区| 宅男在线观看免费高清网站| 婷婷六月综合亚洲| 亚洲欧美日韩综合网| 亚洲一区 二区| 亚洲欧美资源在线| 一区二区国产精品精华液| 亚洲午夜激情在线| 国产成人精品久久久| 国产免费av电影| 91丝袜国产在线播放| 亚洲欧美日产图| 激情av在线播放| 色婷婷狠狠综合| 日本少妇激三级做爰在线| 欧美在线关看| 久久夜色精品国产欧美乱| 五月天综合激情网| 国产一区二区0| 日本一区二区三区免费看| 午夜激情在线| 欧美午夜理伦三级在线观看| 在线播放黄色av| 久久综合五月婷婷| 久久影院资源网| 成人午夜精品视频| 97se亚洲国产综合自在线不卡| 亚洲图色在线| 亚洲精品动漫| 亚洲成人av资源网| 九九精品视频免费| 视频一区二区三区在线| 国产精品我不卡| 国产午夜精品久久久久免费视| 色欲综合视频天天天| 中文字幕99页| 伊人色**天天综合婷婷| 国产乱肥老妇国产一区二| 天堂av在线7| 一级做a爱片久久| 爱豆国产剧免费观看大全剧苏畅| 久久av中文| 97超碰国产精品女人人人爽 | 在线电影看在线一区二区三区| 国产精品原创| 亚洲精品一区二区三区在线观看| 亚洲精品久久久久久国| 日韩不卡免费视频| 欧美资源一区| 亚洲欧洲高清| 亚洲精品一区二区三区婷婷月| 国产亚洲精品码| 国产酒店精品激情| 久久国产精品免费观看| 亚洲午夜剧场| 久久在线免费观看视频| 亚洲中文一区二区三区| 国产精品伦理一区二区| av五月天在线| 日韩精品一卡| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | jizz大全欧美jizzcom| 国产欧美高清视频在线| 国产成人精品电影久久久| 国产在线观看精品一区| 日本韩国欧美在线| 日本性高潮视频| 奇米一区二区三区av| 欧美一区少妇| 六九午夜精品视频| 久久夜色精品亚洲噜噜国产mv| 国产精品一级视频| 亚洲综合色区另类av| 中国男女全黄大片| 99精品热视频只有精品10| 国产欧美日韩一区| 悠悠资源网亚洲青| 亚洲天堂视频在线观看| 一区二区视频免费观看| 国产精品不卡一区| 国产91在线免费观看| 国内精品久久久久久久97牛牛| 国产精品久久精品国产| 黄色视屏在线免费观看| 亚洲乱码国产乱码精品精| 日本欧美www| 中文字幕综合网| 丰满人妻一区二区三区免费视频棣| 亚洲国产精品一区制服丝袜| 久久99九九| 亚洲电影有码| 久久99视频免费| 天天干天天插天天操| 色www精品视频在线观看| 一区二区三区在线播放视频| 国产激情视频一区二区三区欧美| 欧美大片在线播放| 欧美精品一区二区三区精品| 91久久嫩草影院一区二区| 俺来俺也去www色在线观看| 亚洲欧美综合另类中字| 国产精品久久久久久免费| 亚洲第一主播视频| 亚洲黄色免费视频| 国产91色综合久久免费分享| 欧美精品第三页| 久久久久国产| 蜜桃视频日韩| 欧美影院精品| 国产精品va在线| 婷婷av在线| 中文字幕国内精品| 日本高清视频在线| 欧美日韩高清一区| 国产情侣在线视频| 亚洲三级电影网站| 亚洲理论片在线观看| 国产成人精品亚洲午夜麻豆| 老司机午夜av| 亚洲日产国产精品| 青青草影院在线观看| 国产精品一国产精品| 懂色中文一区二区三区在线视频 | 亚洲毛片在线| 亚洲电影网站| 亚洲大片精品免费| 成人9ⅰ免费影视网站| 国产成人77亚洲精品www| 97超碰蝌蚪网人人做人人爽| gogogogo高清视频在线| 一本色道久久综合狠狠躁篇的优点 | 亚洲国产精品久久久| 国产精品天天操| 91国内精品野花午夜精品| 奇米影视第四色777| 亚洲人午夜精品天堂一二香蕉| 微拍福利一区二区| 97se亚洲国产综合自在线| 日韩大尺度视频| 国产乱码一区二区三区| 在线观看免费不卡av| 日本在线不卡视频一二三区| 女人天堂av手机在线| 一区福利视频| 欧美大黑帍在线播放| 91国语精品自产拍| 在线观看亚洲视频啊啊啊啊| 成人在线免费观看91| 日韩欧美一区二区三区四区五区 | 在线成人性视频| 欧美日韩老妇| 天堂一区二区三区| 国产成人三级| 日本视频一区二区不卡| 亚洲精品进入| 欧美一区三区二区在线观看| 国产成人3p视频免费观看| 免费看污久久久| 国产成人ay| 亚洲成人av动漫| 日韩电影免费网站| 伊人久久大香线蕉午夜av| 北条麻妃国产九九九精品小说| 欧美日韩在线一二三| 国产一区不卡| 一区二区三区四区欧美日韩| 国产精品99视频| 樱空桃在线播放| 国产综合激情| 国产91xxx| 天堂va蜜桃一区二区三区漫画版| 日日碰狠狠丁香久燥| 久久综合九色综合欧美狠狠| 婷婷六月天在线| 久久电影网站中文字幕| 亚洲一级片免费观看| 国产jizzjizz一区二区| 久久人妻少妇嫩草av无码专区 | 日本美女黄色一级片| 综合亚洲深深色噜噜狠狠网站| 日本a级片视频| 亚洲国产日韩精品| 中文字幕黄色片| 欧美日韩亚洲高清一区二区| 国产精品怡红院| 精品1区2区在线观看| 青青草在线免费视频| 中文国产亚洲喷潮| 污污在线观看| 热草久综合在线| 天堂久久一区| 国内精品久久久久久久果冻传媒| 色愁久久久久久| 在线视频91| 一区二区三区高清视频在线观看| 一区二区在线播放视频| 国产精品91一区二区| 国产精品亚洲无码| 亚洲欧美国产高清| 精品美女久久久久| 欧美精品在线视频| 天天摸天天碰天天爽天天弄| 永久免费精品影视网站| 日本aa在线| 国产精品美女视频网站| 最新国产精品精品视频| 欧美一区免费视频| 亚洲视频狠狠| 久久人人爽av| 91视频.com| 欧美成人一区二区三区高清| 狠狠躁夜夜躁人人躁婷婷91| 国产精品久久久久久无人区| 精品视频久久久久久久| 大地资源网3页在线观看| 日韩av手机在线| 97se亚洲| 天天成人综合网| 丝袜诱惑制服诱惑色一区在线观看 | 日本三级网站在线观看| 精品视频在线免费| 香蕉久久一区二区三区| 久久99国产精品自在自在app| 少妇精品视频一区二区免费看| 国产精品一区二区三区不卡| 欧美激情欧美| 18岁视频在线观看| 国产成都精品91一区二区三| 91精品久久久久久久久久久久| 午夜视频久久久久久| 国产视频一二三四区| 中文字幕日韩在线观看| 伊人久久国产| 国产免费高清一区| 国内精品福利| 两女双腿交缠激烈磨豆腐| 国产精品国产馆在线真实露脸| 午夜毛片在线观看| 亚洲国产成人精品女人久久久 | 亚洲人成人无码网www国产| 亚洲成人福利片| 亚洲h视频在线观看| 欧美成年人视频| 成人豆花视频| 26uuu成人| 精品一区在线看| 四虎地址8848| 欧美裸体bbwbbwbbw| 69久久久久| 国产日韩一区在线| 久久国产亚洲精品| 日本中文字幕精品—区二区| 中文字幕的久久| 一区二区三区黄色片| 在线亚洲午夜片av大片| 精品亚洲a∨| 在线观看日本一区| 国产精品99久久久久久久女警| 欧洲美女女同性互添| 欧美一区二区三区视频免费播放| 亚洲欧美视频一区二区| 成人网在线免费看| 在线成人超碰| 日本女人性视频| 亚洲一区二区三区三| 欧美一级淫片aaaaaa| 海角国产乱辈乱精品视频| 盗摄系列偷拍视频精品tp| 玩弄中年熟妇正在播放| av激情综合网| 草莓视频18免费观看| 中文字幕欧美日韩精品| 91麻豆精品国产综合久久久| 裸体裸乳免费看| 国产成人av一区二区三区在线观看| 九九热精品在线观看| 精品国产乱码久久久久久闺蜜 | 色伊人久久综合中文字幕| 国产经典自拍视频在线观看| 91精品久久久久久久久青青| 99久久99久久精品国产片果冰| 中文字幕第10页| 姬川优奈aav一区二区| 国产精品四虎| 亚洲tv在线观看| 亚洲国产日本| 日本污视频网站| 欧美一区二区三区婷婷月色 | 精品久久久久久久久久| 国产在线播放av| 亚洲在线观看视频网站| 99在线精品视频在线观看| 成人做爰69片免网站| 日韩丝袜美女视频| 老司机2019福利精品视频导航| 亚洲第一精品区| av一本久道久久综合久久鬼色| 天天综合久久综合| 九九热最新视频//这里只有精品| 思热99re视热频这里只精品| 在线观看免费视频高清游戏推荐| 亚洲在线中文字幕| 国产youjizz在线| 97在线电影| 美女一区二区视频| 尤物视频在线观看国产| 日韩在线播放一区| 亚洲黄页在线观看| 天天综合成人网| 色94色欧美sute亚洲13| 羞羞污视频在线观看| 日韩欧美视频一区二区三区四区| 成人在线综合网| 在线亚洲欧美日韩| 国产91精品久久久久| 你懂的网址国产 欧美|