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

如何在 Asyncio 中使用 Socket

開發 前端
如果使用阻塞套接字創建應用程序,那么阻塞套接字將在等待數據時停止整個線程。這阻止了我們實現并發,因為一次只能從一個客戶端獲取數據。

楔子

本次我們來聊一聊 Socket,以及它如何與 asyncio 搭配使用。

阻塞 Socket

Socket 是對 TCP/IP 協議的一個封裝,可以讓我們更方便地使用 TCP/IP 協議,而不用關注背后的原理。并且我們經常使用的 Web 框架,本質上也是一個 Socket。

所以 Socket 是操作系統對 TCP/IP 網絡協議棧的封裝,并提供了一系列的接口,我們通過這些接口可以實現網絡通信,而不用關注網絡協議的具體細節。

圖片圖片

按照現有的網絡模型,Socket 并不屬于其中的任何一層,但我們可以簡單地將 Socket 理解為傳輸層之上的抽象層,負責連接應用層和傳輸層。Socket 提供了大量的 API,基于這些 API 我們可以非常方便地使用網絡協議棧,在不同主機間進行網絡通信。

Linux 一切皆文件,Socket 也不例外,它被稱為套接字文件,在使用上和普通文件是類似的。

Socket 是什么我們已經知道了,下面來看看如何使用 Socket 進行編程。

圖片圖片

整個過程如下:

  • 服務端初始化 socket,此時會得到「主動套接字」;
  • 服務端調用 bind 方法,將套接字綁定在某個 IP 和端口上;
  • 服務端調用 listen 進行監聽,此時「主動套接字」會變成「監聽套接字」;
  • 服務端調用 accept,等待客戶端連接,此時服務端會阻塞在這里(調用的是阻塞的 API);
  • 客戶端同樣初始化 socket,得到主動套接字;
  • 客戶端調用主動套接字的 connect,向服務器端發起連接請求,如果連接成功,后續客戶端就用這個主動套接字進行數據的傳輸;
  • 當客戶端來連接時,那么服務端的 accept 將不再阻塞,并返回「已連接套接字」,后續服務端便用這個已連接套接字和客戶端進行數據傳輸;
  • 當客戶端來連接時,那么服務端的 accept 將不再阻塞,并返回「已連接套接字」,后續服務端便用這個已連接套接字和客戶端進行數據傳輸;

我們使用來編寫代碼演示一下這個過程,首先是服務端:

import socket

# socket.socket() 會返回一個「主動套接字」
server = socket.socket(
    # 表示使用 IPv4,如果是 socket.AF_INET6
    # 則表示使用 IPv6
    socket.AF_INET,
    # 表示建立 TCP 連接,如果是 socket.SOCK_DGRAM
    # 則表示建立 UDP 連接
    socket.SOCK_STREAM
)
# 當然這兩個參數也可以不傳,因為默認就是它

# 設置套接字屬性,這里讓端口釋放后立刻就能再次使用
server.setsockopt(socket.SOL_SOCKET,
                  socket.SO_REUSEADDR, True)

# 將「主動套接字」綁定在某個 IP 和端口上
server.bind(("localhost", 12345))
# 監聽,此時「主動套接字」會變成「監聽套接字」
server.listen(5)

# 調用 accept,等待客戶端連接,此時會阻塞在這里
# 如果客戶端連接到來,那么會返回「已連接套接字」,也就是這里的 conn
# 至于 addr 則是一個元組,保存了客戶端連接的信息(IP 和端口)
conn, addr = server.accept()

# 下面我們通過「已連接套接字」conn 和客戶端進行消息的收發
# 收消息使用 recv、發消息使用 send,和 read、write 本質是一樣的
while True:
    msg = conn.recv(1024)
    # 當客戶端斷開連接時,msg 會收到一個空字節串
    if not msg:
        print("客戶端已經斷開連接")
        conn.close()
        break
    print("客戶端發來消息:", msg.decode("utf-8"))
    # 然后我們加點內容之后,再給客戶端發過去
    conn.send("服務端收到, 你發的消息是: ".encode("utf-8") + msg)

接下來編寫客戶端:

import socket

# 返回主動套接字
client = socket.socket(socket.AF_INET,
                       socket.SOCK_STREAM)
# 連接服務端
client.connect(("localhost", 12345))
while True:
    # 發送消息
    data = input("請輸入內容: ")
    if data.strip().lower() in ("q", "quit", "exit"):
        client.close()
        print("Bye~~~")
        break
    client.send(data.encode("utf-8"))
    print(client.recv(1024).decode("utf-8"))

啟動服務端和客戶端進行測試:

圖片圖片

還是比較簡單的,當然我們這里的服務端每次只能和一個客戶端通信,如果想服務多個客戶端的話,那么需要為已連接套接字單獨開一個線程和客戶端進行通信,然后主線程繼續調用 accept 方法等待下一個客戶端。

下面來編寫一下多線程的版本,這里只需要編寫服務端即可,客戶端代碼不變。

import socket
import threading

server = socket.socket()
server.setsockopt(socket.SOL_SOCKET,
                  socket.SO_REUSEADDR, True)
server.bind(("localhost", 12345))
server.listen(5)


def handle_message(conn, addr):
    while True:
        msg = conn.recv(1024)
        if not msg:
            print(f"客戶端(ip: {addr[0]}, port: {addr[1]}) 已經斷開連接")
            conn.close()
            break
        print(f"客戶端(ip: {addr[0]}, port: {addr[1]}) 發來消息:",
              msg.decode("utf-8"))
        conn.send("服務端收到, 你發的消息是: ".encode("utf-8") + msg)


while True:
    conn, addr = server.accept()
    threading.Thread(
        target=handle_message,
        args=(conn, addr)
    ).start()

代碼很簡單,就是把已連接套接字和客戶端的通信邏輯寫在了單獨的函數中,每來一個客戶端,服務端都會啟動一個新的線程去執行該函數,然后繼續監聽,等待下一個客戶端連接到來。

然后客戶端代碼不變,我們啟動三個客戶端去和服務端通信,看看結果如何。

圖片圖片

結果一切正常,當然我們這里的代碼比較簡單,就是普通的消息收發。你也可以實現一個更復雜的功能,比如文件下載器,把服務端當成網盤,支持客戶端上傳和下載文件,并不難。

非阻塞 Socket

先回顧一下 socket 模型:

圖片圖片

但是注意:我們說在 listen() 這一步,會將主動套接字轉化為監聽套接字,但此時的監聽套接字的類型是阻塞的。阻塞類型的監聽套接字在調用 accept() 方法時,如果沒有客戶端來連接的話,就會一直處于阻塞狀態,那么此時主線程就沒法干其它事情了。

所以要設置為非阻塞,而非阻塞的監聽套接字在調用 accept() 時,如果沒有客戶端來連接,那么主線程不會傻傻地等待,而是會直接返回,然后去做其它的事情。

類似的,我們在創建已連接套接字的時候默認也是阻塞的,阻塞類型的已連接套接字在調用 send() 和 recv() 的時候也會處于阻塞狀態。比如當客戶端一直不發數據的時候,已連接套接字就會一直阻塞在 recv() 這一步。如果是非阻塞類型的已連接套接字,那么當調用 recv() 但卻收不到數據時,也不用處于阻塞狀態,同樣可以直接返回去做其它事情。

import socket

server = socket.socket()
server.bind(("localhost", 12345))
# 調用 setblocking 方法,傳入 False
# 表示將監聽套接字和已連接套接字的類型設置為非阻塞
server.setblocking(False)
server.listen(5)

while True:
    try:
        # 非阻塞的監聽套接字調用 accept() 時
        # 如果發現沒有客戶端連接,則會立刻拋出 BlockingIOError
        # 因此這里寫了個死循環
        conn, addr = server.accept()
    except BlockingIOError:
        pass
    else:
        break

while True:
    try:
        # 同理,非阻塞的已連接套接字在調用 recv() 時
        # 如果發現客戶端沒有發數據,那么同樣會報錯
        msg = conn.recv(1024)
    except BlockingIOError:
        pass
    else:
        print(msg.decode("utf-8"))
        conn.send(b"data from server")

很明顯,雖然上面的代碼在運行的時候正常,但存在兩個問題:

1)雖然 accept() 不阻塞了,在沒有客戶端連接時主線程可以去做其它事情,但如果后續有客戶端連接,主線程要如何得知呢?因此必須要有一種機制,能夠繼續在監聽套接字上等待后續連接請求,并在請求到來時通知主線程。我們上面的做法是寫了一個死循環,但很明顯這是沒有意義的,這種做法還不如使用阻塞的套接字。

2)send() / recv() 不阻塞了,相當于 I/O 讀寫流程不再是阻塞的,讀寫方法都會瞬間完成并返回,也就是說它會采用能讀多少就讀多少、能寫多少就寫多少的策略來執行 I/O 操作,這顯然更符合我們對性能的追求。

圖片圖片

顯然對于非阻塞套接字而言,會面臨一個問題,那就是當我們執行讀取操作時,有可能只讀了一部分數據,剩余的數據客戶端還沒發過來,那么這些數據何時可讀呢?同理寫數據也是這種情況,當緩沖區滿了,而我們的數據還沒有寫完,那么剩下的數據又何時可寫呢?因此同樣要有一種機制,能夠在主線程做別的事情的時候繼續監聽已連接套接字,并且在有數據可讀寫的時候通知主線程。

這樣才能保證主線程既不會像基本 IO 模型一樣,一直在阻塞點等待,也不會無法處理實際到達的客戶端連接請求和可讀寫的數據,而上面所提到的機制便是 I/O 多路復用。

早期的所有框架都是非阻塞 + 回調 + 基于 IO 多路復用的事件循環,這種模式的性能也非常高,Redis 和 Nginx 都是基于這種方式實現了高并發。只是這種編碼方式非常痛苦,它將好端端的自上而下的邏輯分割的四分五裂,而且也不好維護,它使得開發人員在編寫業務邏輯的同時,還要關注并發細節。

因此使用多路復用 + 回調的方式編寫異步化代碼,雖然并發量能上去,但是對開發者很不友好;而使用同步的方式編寫同步代碼,雖然很容易理解,可并發量卻又上不去。那么問題來了,有沒有一種辦法,能夠讓我們在享受異步化帶來的高并發的同時,又能以同步的方式去編寫代碼呢?也就是我們能不能以同步的方式去編寫異步化的代碼呢?

答案是可以的,使用「協程」便可以辦到。協程在這種模式的基礎之上又批了一層外衣,兼顧了開發效率與運行效率。

在 asyncio 中使用 Socket

asyncio 的事件循環提供了處理套接字的一些方法,我們主要會用到三個:

  • sock_accept()
  • sock_recv()
  • sock_sendall()

這些方法類似于前面使用的套接字方法,但不同之處在于,它們需要接收非阻塞套接字作為參數,然后返回協程。我們可以等待協程,直到有數據可供操作。

先來看一下 sock_accept(),它類似于 server.accept()。

conn,add = await loop.sock_accept(sock)

然后 sock_recv 和 sock_sendall 的調用方式與 sock_accept 類似,它們接收一個套接字,然后返回協程對象。通過 await 表達式,sock_recv 將會阻塞,直到套接字有可以處理的字節;sock_sendall 接收一個套接字和要發送的數據,同樣會陷入阻塞,直到要發送給套接字的所有數據都發送完畢,成功時返回 None。

data = await loop.sock_recv(sock)
await loop.sock_sendall(sock, data)

下面我們就基于 asyncio 設計一個回顯服務器。

import asyncio
import socket

async def echo(conn: socket.socket):
    loop = asyncio.get_running_loop()
    # 無限循環等待來自客戶端連接的數據
    try:
        while data := await loop.sock_recv(conn, 1024):
            # 收到數據之后再將其發送給客戶端
            # 為了區分,我們發送的時候在結尾加一個 b"~"
            await loop.sock_sendall(conn, data + b"~")
    except Exception as e:
        print(f"服務出錯: {e}")
    finally:
        conn.close()

async def listen_for_conn(server: socket.socket):
    loop = asyncio.get_running_loop()
    while True:
        conn, addr = await loop.sock_accept(server)
        conn.setblocking(False)
        print(f"收到客戶端 {addr} 的連接")
        # 每次連接時,都創建一個任務來監聽客戶端的數據
        asyncio.create_task(echo(conn))

async def main():
    server = socket.socket()
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    server.setblocking(False)
    server.bind(("localhost", 12345))
    server.listen()

    await listen_for_conn(server)

asyncio.run(main())

運行這個應用程序可以同時服務多個客戶端,它里面同樣使用了 IO 多路復用,只不過事件循環將它封裝起來了,我們不需要直接面對。所以這種編程模式就簡單多了。

小結

如果使用阻塞套接字創建應用程序,那么阻塞套接字將在等待數據時停止整個線程。這阻止了我們實現并發,因為一次只能從一個客戶端獲取數據。

使用非阻塞套接字構建應用程序,這些套接字總是會立即返回,而結果有兩種:要么已經準備好了數據,要么因為沒有數據而出現異常。

使用 asyncio 的事件循環方法來構建具有非阻塞套接字的應用程序,這些方法接收一個套接字并返回一個協程,然后可在 await 表達式中使用它。這將暫停父協程,直到套接字帶有數據。事件循環就是基于 IO 多路復用做的一個封裝,而 IO 多路復用能夠實現的前提之一就是:套接字必須是非阻塞的。

責任編輯:武曉燕 來源: 古明地覺的編程教室
相關推薦

2022-06-23 08:00:53

PythonDateTime模塊

2021-06-09 09:36:18

DjangoElasticSearLinux

2021-03-09 07:27:40

Kafka開源分布式

2015-08-27 09:46:09

swiftAFNetworkin

2022-05-17 08:25:10

TypeScript接口前端

2011-08-10 09:31:41

Hibernateunion

2019-09-16 19:00:48

Linux變量

2024-09-06 11:34:15

RustAI語言

2020-11-30 11:55:07

Docker命令Linux

2014-07-02 09:47:06

SwiftCocoaPods

2020-04-09 10:18:51

Bash循環Linux

2022-10-25 09:07:28

Linuxxargs命令

2023-12-01 09:18:27

AxiosAxios 庫

2015-11-26 10:57:56

DockerOpen vSwitc

2021-09-10 10:30:22

Java代碼

2025-03-21 09:58:59

Python數據類型安全

2018-05-16 10:32:06

Linux命令find

2015-08-31 13:42:06

IDEDockerdoclipser

2023-01-28 17:41:07

Java代碼

2023-01-05 17:13:28

TypeScript泛型組件
點贊
收藏

51CTO技術棧公眾號

欧美日韩一区二区免费视频| 首页国产欧美久久| 欧美一区二区免费视频| 久在线观看视频| jyzzz在线观看视频| 久久精品国产77777蜜臀| 欧美成人在线网站| 成人免费av片| 日本免费一区二区视频| 日韩欧美在线国产| 日日噜噜夜夜狠狠久久丁香五月| 色香蕉在线视频| 久久电影国产免费久久电影| 国自产精品手机在线观看视频| 国产精品密蕾丝袜| 免费观看亚洲视频大全| 91国产免费看| 日韩精品一区在线视频| 欧美激情图片区| 亚洲中文字幕无码一区二区三区| 亚洲欧美日本在线观看| 国产精品中文字幕一区二区三区| 日本久久久久久久| 欧美日韩国产精品综合| 日韩激情免费| 亚洲男人天堂网站| 丝袜熟女一区二区三区| 亚洲电影二区| 欧洲国内综合视频| 北条麻妃69av| 黄色aa久久| 亚洲精品视频免费观看| 亚洲精品国产精品国自产观看| 日韩一级中文字幕| 国产东北露脸精品视频| 成人午夜在线影院| 伊人久久国产精品| 日韩精品免费视频人成| 欧美最猛黑人xxxx黑人猛叫黄| 久久中文字幕在线观看| 欧美一区成人| 久久久精品免费| 亚洲欧美卡通动漫| 欧美丰满老妇| 日韩视频在线免费观看| 国产在线免费av| 欧美精选一区二区三区| 亚洲欧美精品suv| 91精品国产自产| 秋霞影视一区二区三区| 亚洲国产欧美在线成人app| youjizz.com日本| 日韩影片在线观看| 欧美xxxxx牲另类人与| 手机在线观看日韩av| 日日夜夜精品视频| 日韩女优制服丝袜电影| 国产精品19p| 国产成人在线中文字幕| 亚洲国产福利在线| 国内精品久久99人妻无码| 妖精一区二区三区精品视频| 亚洲欧美国产精品| 成人小视频免费看| 亚洲91中文字幕无线码三区| 欧美成人合集magnet| 曰本女人与公拘交酡| 亚洲午夜黄色| 91av在线网站| 91黑人精品一区二区三区| 免费在线观看日韩欧美| 91久久精品日日躁夜夜躁国产| 国产美女主播在线观看| 国产精品18久久久久久久久久久久| 97超碰在线播放| 特黄aaaaaaaaa真人毛片| 91美女片黄在线观看| 日韩av不卡在线播放| 一级毛片视频在线| 亚洲精品va在线观看| www国产免费| 亚洲福利影院| 欧美日韩国产综合草草| 成年女人免费视频| 免费欧美一区| 超碰精品一区二区三区乱码| 国产精品第56页| 日韩av中文字幕一区二区| 91在线直播亚洲| 亚洲欧洲精品视频| 国产精品短视频| 国产精品网站免费| 久久青草视频| 亚洲大胆人体视频| 天海翼在线视频| 国产精品美女久久久| 成人久久久久爱| 青青九九免费视频在线| 亚洲天堂福利av| 久章草在线视频| 日韩一区二区三区精品| 一本色道久久综合狠狠躁篇的优点 | 超碰97国产在线| 欧美日韩在线中文字幕| 亚洲精品成人天堂一二三| 亚洲精品中文字幕无码蜜桃| 日韩在线成人| 久久久精品欧美| 久久精品五月天| 成人免费观看男女羞羞视频| 亚洲精品永久www嫩草| 国产伦理精品| 日韩一区二区精品在线观看| 极品蜜桃臀肥臀-x88av| 99国产精品99久久久久久粉嫩| 国产一区二区在线免费视频| 视频国产一区二区三区| 一区二区三区精品视频| 久久久久国产一区| 亚洲制服一区| 午夜精品在线视频| 成人黄色免费视频| 成人欧美一区二区三区小说 | 欧美成人精品三级网站| 精品盗摄一区二区三区| 少妇人妻丰满做爰xxx| 理论电影国产精品| 日本一区二区三区视频在线观看| cao在线视频| 337p日本欧洲亚洲大胆精品 | 欧美三区视频| 91九色综合久久| 免费网站看v片在线a| 欧美亚洲一区二区在线观看| 国精品无码人妻一区二区三区| 亚洲第一区色| 国产精品三区在线| 久久电影网站| 精品国产99国产精品| 国产小视频在线观看免费| 国产不卡在线一区| 日韩成人三级视频| 一区二区三区四区高清视频| 久久国产精品电影| 精品国自产在线观看| 亚洲日本一区二区| 初高中福利视频网站| 欧美精品综合| 粉嫩av免费一区二区三区| 青青草原国产在线| 精品福利二区三区| 1级黄色大片儿| 91免费看视频| 亚洲五月天综合| 成人网18免费网站| 国产区精品在线观看| 黄色网页在线免费看| 日韩一级大片在线观看| 国产一国产二国产三| av一区二区三区| 岳毛多又紧做起爽| 精品国产视频| 成人在线播放av| 麻豆av在线免费观看| 亚洲成av人乱码色午夜| 日日夜夜综合网| 国产亚洲短视频| 色一情一区二区三区| 欧美成人亚洲| 精品日本一区二区| 快播电影网址老女人久久| 色偷偷噜噜噜亚洲男人的天堂| 99国产精品久久久久久久成人| 亚洲一区在线观看免费观看电影高清| 欧产日产国产精品98| 视频在线观看一区二区三区| 在线亚洲美日韩| 国产欧美啪啪| 国产精品香蕉av| 青春草在线免费视频| 国产婷婷成人久久av免费高清| 正在播放亚洲精品| 亚洲成人动漫av| 69视频在线观看免费| 国产在线精品不卡| 成人在线免费观看av| 日韩在线欧美| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 国产精品伦一区| 私密视频在线观看| 奇米影视在线99精品| 日韩 欧美 视频| 清纯唯美综合亚洲| 国产日韩欧美一区二区三区四区| 日韩av免费| 国内精品小视频| 午夜免费福利在线观看| 亚洲第一中文字幕| 国产精品久久久国产盗摄| 午夜精品在线视频一区| 日本二区三区视频| 91麻豆精品视频| 色诱av手机版| 黄色资源网久久资源365| 亚洲国产精品久久久久婷蜜芽| 亚洲成av人片乱码色午夜| 欧美午夜精品久久久久免费视| 日韩精品视频一区二区三区| 国产精品扒开腿爽爽爽视频| 爱情岛亚洲播放路线| 日韩在线观看免费高清完整版| 三级在线视频| 精品国产乱码久久久久久闺蜜 | 悠悠资源网亚洲青| 欧美黑人一级爽快片淫片高清| www.亚洲.com| 日韩精品一区二区三区第95| www.久久久久久| 欧美日韩情趣电影| 99成人精品视频| 欧美午夜视频在线观看| 国产精品6666| 亚洲自拍偷拍欧美| 国产探花在线免费观看| 国产精品美女一区二区三区| 欧美特级黄色录像| 91在线视频官网| 中文字幕影片免费在线观看| 国产成人精品1024| 特种兵之深入敌后| 国产精品综合视频| 国产又粗又长又爽又黄的视频| 久久精品国产第一区二区三区 | 国产一区久久久| www.99r| 乱一区二区av| 亚洲欧美aaa| 九色综合狠狠综合久久| 99sesese| 精品一区二区三区影院在线午夜 | 精品一区二区三区免费看| 国产精品久久久久久久久久三级 | 欧美日韩国产综合久久| 中文字幕在线日亚洲9| 欧美性色综合网| 中文字幕 日韩有码| 欧美日韩一区二区电影| 亚洲天堂视频网| 在线成人高清不卡| av免费观看在线| 欧美videos中文字幕| 亚洲第一视频在线播放| 亚洲福利视频专区| 深夜影院在线观看| 亚洲女人被黑人巨大进入| 加勒比一区二区三区在线| 亚洲人成电影在线| 国产一级网站视频在线| 丝袜亚洲欧美日韩综合| 国产欧美久久久久久久久| 欧美激情视频网站| 国产乱码精品一区二三赶尸艳谈| 欧美中文在线字幕| 成人av色网站| 147欧美人体大胆444| 另类春色校园亚洲| 日本一区二区久久精品| 天天av综合| 久久国产精品网| 日韩专区欧美专区| 中文字幕一区二区在线观看视频| 国产成人av资源| 狠狠人妻久久久久久综合蜜桃| 国产欧美一区二区三区沐欲| 黄色一级大片在线免费观看| 亚洲一卡二卡三卡四卡| 激情视频网站在线观看| 欧美精品久久久久久久多人混战| 午夜精品久久久久久久96蜜桃| 亚洲高清在线观看| 调教视频免费在线观看| 欧美国产日韩精品| 亚洲mmav| 成人午夜电影在线播放| 亚洲资源网站| 青青草视频在线视频| 久久国产高清| 四川一级毛毛片| 国产免费成人在线视频| 久青草免费视频| 欧美丝袜丝交足nylons| 亚洲精品国产suv一区| 国产香蕉97碰碰久久人人| 深夜国产在线播放| 国产精品美女免费视频| 加勒比色综合久久久久久久久| 日韩一本精品| 一区免费在线| 红桃视频 国产| www成人在线观看| 91在线播放观看| 欧美性受xxxx黑人xyx| 蜜桃视频污在线观看| 北条麻妃久久精品| 波多野结衣亚洲| 999在线观看免费大全电视剧| 国产日产精品一区二区三区四区的观看方式| ijzzijzzij亚洲大全| 丝袜亚洲另类丝袜在线| 大桥未久恸哭の女教师| 亚洲欧洲日韩av| 波多野结衣黄色| 精品无码久久久久久国产| av中文字幕在线观看| 国产精品日本精品| 蜜乳av综合| 成人在线观看你懂的| 国产精品99久久久久久久女警| 毛片久久久久久| 日本久久电影网| 五月激情丁香婷婷| 欧美精品久久久久a| 4438五月综合| 亚洲视频在线观看日本a| 免费视频久久| 亚洲成av人片在线观看无| 一区二区久久久| jizz中国女人| 大胆人体色综合| 少妇高潮一区二区三区99| 台湾成人av| 三级欧美在线一区| 中文字幕在线看高清电影| 精品久久久视频| 少妇一级淫片免费看| 97碰在线观看| 欧美重口另类| 狠狠爱免费视频| 久久免费看少妇高潮| 久久人妻免费视频| 日韩精品在线看| 97se综合| 蜜桃精品久久久久久久免费影院| 亚洲美女啪啪| 免费成人深夜夜行p站| 欧美日韩一区二区免费视频| 男男激情在线| 国产成人97精品免费看片| 久久99国内| 91福利国产成人精品播放| 中文字幕二三区不卡| 一级黄色片在线看| 久久影视电视剧免费网站| 日韩免费高清视频网站| 国产精品69久久久| 91香蕉视频污| 欧美黄色一级大片| 中文字幕最新精品| 99久久这里有精品| 国产va亚洲va在线va| 99视频在线观看一区三区| 一级黄色在线视频| 日韩一中文字幕| 一区三区自拍| 超碰97人人射妻| 中文字幕在线观看不卡| www黄色在线观看| 97人人做人人爱| 国产真实有声精品录音| 亚洲天堂2018av| 亚洲综合色区另类av| 婷婷婷国产在线视频| 国产精品网址在线| 欧美精品一卡| 五月天综合视频| 欧美一级二级三级乱码| 91av久久| 亚洲欧美精品| 成人小视频在线| 波多野结衣绝顶大高潮| 欧美成人精品xxx| 西野翔中文久久精品国产| 校园春色 亚洲色图| 亚洲自拍偷拍网站| 国产爆初菊在线观看免费视频网站 | 久久久亚洲精品一区二区三区 | 在线成人免费网站| 国产精品调教视频| 中文av一区二区三区| 亚洲高清免费视频| 2017亚洲天堂1024| 国产区一区二区三区| 日本va欧美va精品发布| 欧产日产国产v| 亚洲午夜未删减在线观看| 日本免费一区二区三区视频| 欧美一级黄色片视频| 又紧又大又爽精品一区二区| 免费福利在线观看| 国产精品国产三级欧美二区|