日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Py网络编程及应用(urllib、socket/selectors)

發布時間:2024/3/13 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Py网络编程及应用(urllib、socket/selectors) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
# -*- coding: utf-8 -*-''' #Py網絡編程及應用.py (urllib、socket/selectors)注意: 一、socket模塊: 1、通過指定socket類構造器參數type可指定通信協議類型:TCP協議通信、UDP協議通信 2、socket套接字提供兩個方法:send 和 recv,分別表示發送和接受數據 3、注意發送與接收數據的 編碼解碼問題二、selectors模塊: 1、selectors模塊使用sel的register方法注冊函數,然后使用select方法獲取注冊事件來準備調用注冊函數, 這樣以代替常規阻塞式通信的的accept方法循環 send發送數據 及 recv接收數據。深入: 1、socket通信的 UDP協議通信 多點廣播原理和實現 需后期繼續了解深入 http://c.biancheng.net/view/2663.html使用: 一、urllib 模塊 urllib 模塊可以打開任意 URL 所指向的資源,就像打開本地文件一樣,這樣程序就能完整地下載遠程頁面。 如果再與 re 模塊結合使用,那么程序完全可以提取頁面中各種信息,這就是所謂的“網絡爬蟲”的初步原理。 1、urllib.request子模塊 打開和讀取 URL 的各種函數。 結合 多線程threading模塊 以及 threading.timer定時器 來創建任務進行 多線程下載 以及 定時循環輸出下載完成進度。 2、urllib.parse子模塊 用于解析 URL 地址 和 查詢字符串的函數:二、socket模塊 socket通信 分為兩端:服務器端 和 客戶端; socket通信 通過指定socket類的構造器參數type可指定通信協議類型TCP、UDP等。 socket通信 基本上是一個信息通道,兩端各有一個程序;三、selectors 模塊 selectors 模塊允許 socket 以非阻塞方式進行通信。 selectors 相當于一個事件注冊中心,程序只要將 socket 的所有事件注冊給 selectors 管理,當 selectors 檢測到 socket 中的特定事件之后,程序就調用相應的監聽方法進行處理。 selectors 主要支持兩種事件: 1、selectors.EVENT_READ:當 socket 有數據可讀時觸發該事件。當有客戶端連接進來時也會觸發該事件。 2、selectors.EVENT_WRITE:當 socket 將要寫數據時觸發該事件。'''# ============================================================================= # #urllib 模塊 # #urllib 模塊可以打開任意 URL 所指向的資源,就像打開本地文件一樣,這樣程序就能完整地下載遠程頁面。 # #如果再與 re 模塊結合使用,那么程序完全可以提取頁面中各種信息,這就是所謂的“網絡爬蟲”的初步原理。 # ============================================================================= ''' 使用:一、urllib.request子模塊 打開和讀取 URL 的各種函數。 1、urllib.request.urlopen(url, data=None) 方法,該方法用于打開 url 指定的資源,并從中讀取數據。 根據請求 url 的不同,該方法的返回值會發生動態改變。 如果 url 是一個 HTTP 地址,那么該方法返回一個 http.client.HTTPResponse 對象。2、urllib.request模塊 結合 多線程threading模塊 以及 threading.timer定時器 來創建任務進行 多線程下載 以及 定時循環輸出下載完成進度。二、urllib.parse子模塊 用于解析 URL 地址 和 查詢字符串的函數: 1、urlparse() 解析URL字符串 2、urlunparse() 將解析后ParseResult對象或元祖 回復稱 URL字符串 3、parse_qs() 和 parse_qsl()(這個 l 代表 list)兩個函數都用于解析查詢字符串,只不過返回值不同而已, 4、urljoin() 函數負責將兩個 URL 拼接在一起,返回代表絕對地址的 URL。'''import urllibhelp(urllib) urllib.__path__ dir(urllib)#import os #os.startfile(urllib.__path__[0])#urllib 模塊則包含了多個用于處理 URL 的子模塊: help(urllib.request) #這是最核心的子模塊,它包含了打開和讀取 URL 的各種函數。 help(urllib.parse) #用于解析 URL。 #help(urllib.robotparser) #主要用于解析 robots.txt 文件。(無此子模塊) help(urllib.response) # help(urllib.error) #主要包含由 urllib.request 子模塊所引發的各種異常。#################### #urllib.request 子模塊 核心的子模塊,它包含了打開和讀取 URL 的各種函數。 import urllibhelp(urllib.request) urllib.request.__all__ dir(urllib.request)help(urllib.request.urlopen) help(urllib.request.Request) help(urllib.request.Request.add_header)#使用: #urllib.request.urlopen(url, data=None) 方法,該方法用于打開 url 指定的資源,并從中讀取數據。根據請求 url 的不同,該方法的返回值會發生動態改變。如果 url 是一個 HTTP 地址,那么該方法返回一個 http.client.HTTPResponse 對象。 from urllib.request import *result=urlopen('http://www.crazyit.org/index.php') #打開URL對應的資源 data=result.read(326) #按字節讀取數據 print(data.decode('utf-8')) #將字節解碼輸出with urlopen('http://www.crazyit.org/index.php') as f: #上下文管理 打開URL對應的資源data=f.read(326) #按字節讀取數據print(data.decode('utf-8')) #將字節解碼輸出#使用: #urlopen() 函數打開遠程資源時,第一個 url 參數既可以是 URL 字符串, #也可以使用 urllib.request.Request 對象。#urllib.request.Request類對象的的構造器方法來發送POST請求等#urllib.request.Request 對象的構造器如下: #urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)#示例: #實現了一個多線程下載的工具類: #通過 urlopen() 函數打開遠程資源之后,也可以非常方便地讀取遠程資源(甚至實現多線程下載)。 from urllib.request import * import threadingclass DownThread(threading.Thread):'''定義 下載線程 類,繼承自線程模塊類定義 DownThread 線程類,該線程類負責讀取從 start_pos 開始、長度為 current_part_size 的所有字節數據,并寫入本地文件對象中'''def __init__(self, path, start_pos, current_part_size, current_part):super().__init__()self.path=pathself.start_pos=start_pos #定義當前線程的下載位置self.current_part_size=current_part_size #定義當前線程負責下載的文件大小self.current_part=current_part #定義當前線程需要下載的文件快self.length=0 #定義該線程已經下載的字節數def run(self):req=Request(url=self.path, method='GET')req.add_header('Accept','*/*')req.add_header('Charset','UTF-8')req.add_header('Connection','Keep-Alive')f=urlopen(req)for i in range(self.start_pos): #跳過self.start_pos個字節,表明線程只下載自己負責的那部分內容f.read(1)while self.length < self.current_part_size: #讀取網路數據,并寫入本地文件data=f.read(1024)if data is None or len(data) <= 0:breakself.current_part.write(data)self.length += len(data) #累計該線程下載的總大小self.current_part.close()f.close()class DownUtil:'''DownUtils 類的 download() 方法負責按如下步驟來實現多線程下載:1、使用 urlopen() 方法打開遠程資源。2、獲取指定的 URL 對象所指向資源的大小(通過 Content-Length 響應頭獲取)。3、計算每個線程應該下載網絡資源的哪個部分(從哪個字節開始,到哪個字節結束)。4、依次創建并啟動多個線程來下載網絡資源的指定部分。'''def __init__(self,path, target_file, thread_num):self.path=path #定義下載資源的路徑self.thread_num=thread_num #定義線程數量self.target_file=target_file #定義所下載的文件的保存位置self.threads=[] #初始化線程列表def download(self):req=Request(url=self.path, method='GET') #實例化創建Request對象req.add_header('Accept', '*/*') #添加請求頭req.add_header('Charset','UTF-8') req.add_header('Connection', 'Keep-Alive') f=urlopen(req) #打開要下載的資源self.file_size=int(dict(f.headers).get('Content-Length',0)) #獲取所下載的文件大小:字典的get方法,如果不存在默認返回0f.close() current_part_size=self.file_size // self.thread_num + 1 #計算每個線程要下載的文件大小for i in range(self.thread_num):start_pos=i * current_part_size #計算每個線程的開始位置t=open(self.target_file,'wb') #打開文件進行下載t.seek(start_pos,0) #定義線程的下載位置td=DownThread(self.path, start_pos, current_part_size, t) #創建下載線程self.threads.append(td)td.start() #啟動線程def get_complete_rate(self):'''獲取下載的完成百分比'''sum_size=0 #統計多個線程已經下載的總大小for i in range(self.thread_num):sum_size += self.threads[i].lengthreturn sum_size / self.file_size #返回已經完成的百分比# DownUtil 工具類之后,接下來就可以在主程序中調用該工具類的 download() 方法執行下載 du=DownUtil('http://www.crazyit.org/data/attachment/'\+ 'forum/201801/19/121212ituj1s9gj8g880jr.png','測試文件\\a.png',3) du.download() #實例化創建對象后開始下載操作def show_process():'''間隔時間連續循環顯示完成比例'''print('已完成:{:.0f}%'.format((du.get_complete_rate() *100)))global tif du.get_complete_rate()<1: #如果沒有100%完成t=threading.Timer(0.5,show_process) #定時器 0.5秒后調用自身函數循環t.start() t=threading.Timer(0.1,show_process) #定時器 0.1秒后調用函數 t.start()#測試 單獨輸出文件大小 path='http://www.crazyit.org/data/attachment/'\+ 'forum/201801/19/121212ituj1s9gj8g880jr.png'req=Request(url=path, method='GET') #實例化創建Request對象 req.add_header('Accept', '*/*') #添加請求頭 req.add_header('Charset','UTF-8') req.add_header('Connection', 'Keep-Alive') f=urlopen(req) #打開要下載的資源 file_size=int(dict(f.headers).get('Content-Length',0)) #獲取所下載的文件大小 print(file_size)f.close() #################### #urllib.parse 子模塊 用于解析 URL 地址 和 查詢字符串的函數:help(urllib.parse) urllib.parse.__all__ dir(urllib.parse)help(urllib.parse.urlparse) help(urllib.parse.parse_qs) help(urllib.parse.parse_qsl) help(urllib.parse.urlencode) help(urllib.parse.urljoin)#1、urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True): #該函數用于解析 URL 字符串。程序返回一個 ParseResult 對象,可以獲取解析出來的數據。#2、urllib.parse.urlunparse(parts): #該函數是上一個函數的反向操作,用于將解析結果反向拼接成 URL 地址。#3、urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace'): #該該函數用于解析查詢字符串(application/x-www-form-urlencoded 類型的數據),并以 dict 形式返回解析結果。#4、urllib.parse.parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace'): #該函數用于解析查詢字符串(application/x-www-form-urlencoded 類型的數據),并以列表形式返回解析結果。#5、urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus): #將字典形式或列表形式的請求參數恢復成請求字符串。該函數相當于 parse_qs()、parse_qsl() 的逆函數。#6、urllib.parse.urljoin(base, url, allow_fragments=True): #該函數用于將一個 base_URL 和另一個資源 URL 連接成代表絕對地址的 URL。######### #示例 使用urlparse()函數來解析URL字符串 from urllib.parse import *#使用: #urlparse()解析URL字符串 #urlparse()方法解析 URL 字符串,返回一個 ParseResult 對象,該對象實際上是 tuple 的子類。 #因此,程序既可通過屬性名來獲取 URL 的各部分,也可通過索引來獲取 URL 的各部分。 result=urlparse('http://www.crazyit.org:80/index.php;yeeku?name=fkit#frag') print(result) print(type(result))#通過屬性名和索引來獲取URL的各部分 print('scheme:', result.scheme, result[0]) #輸出 http print('主機和端口:', result.netloc, result[1]) #輸出 www.crazyit.org:80 print('主機:', result.hostname) #輸出 www.crazyit.org print('端口:', result.port) #輸出 80 print('資源路徑:', result.path, result[2]) #輸出 index.php print('參數:', result.params, result[3]) #輸出 yeeku print('查詢字符串:', result.query, result[4]) #輸出 name=fkit print('fragment:', result.fragment, result[5]) #輸出 frag print(result.geturl())#使用: #urlunparse()將解析后ParseResult對象或元祖 回復稱 URL字符串 result=urlunparse(('http','www.crazyit.org:80','index.php','yeeku','name=fkit','frag')) print('反解析后的URL如下:\n' + result)#被解析的 URL 以雙斜線(//)開頭,那么 urlparse() 函數可以識別出主機,只是缺少 scheme 部分。 result=urlparse('//www.crazyit.org:80/index.php') print('scheme:', result.scheme, result[0]) print('主機和端口:', result.netloc, result[1]) print('資源路徑:', result.path, result[2]) print('-----------------')#被解析的 URL 既沒有 scheme,也沒有以雙斜線(//)開頭,那么 urlparse() 函數將會把這些 URL 都當成資源路徑。 result=urlparse('www.crazyit.org:80/index.php') print('scheme:', result.scheme, result[0]) print('主機和端口:', result.netloc, result[1]) print('資源路徑:', result.path, result[2]) print('++++++++++++++++++')#使用: #parse_qs() 和 parse_qsl()(這個 l 代表 list)兩個函數都用于解析查詢字符串,只不過返回值不同而已, #parse_qsl() 函數的返回值是 list(正如該函數名所暗示的)。 #urlencode() 則是它們的逆函數。 result = parse_qs('name=fkit&name=%E7%96%AF%E7%8B%82java&age=12') #解析查詢字符串,返回dict print(result)result = parse_qsl('name=fkit&name=%E7%96%AF%E7%8B%82java&age=12') #解析查詢字符串,返回list print(result)print(urlencode(result)) #將列表格式的請求參數 恢復成 請求參數字符串#使用: #urljoin() 函數負責將兩個 URL 拼接在一起,返回代表絕對地址的 URL。 #這里主要可能出現 3 種情況: #1、被拼接的 URL 只是一個相對路徑 path(不以斜線開頭),那么該 URL 將會被拼接到 base 之后,如果 base 本身包含 path 部分,則用被拼接的 URL替換 base 所包含的 path 部分。 #2、被拼接的 URL 是一個根路徑 path(以單斜線開頭), 那么該 URL 將會被拼接到 base 的域名之后。 #3、被拼接的 URL 是一個絕對路徑 path(以雙斜線開頭), 那么該 URL將會被拼接到 base 的 scheme 之后。# 被拼接URL不以斜線開頭 result = urljoin('http://www.crazyit.org/users/login.html', 'help.html') print(result) # http://www.crazyit.org/users/help.html result = urljoin('http://www.crazyit.org/users/login.html', 'book/list.html') print(result) # http://www.crazyit.org/users/book/list.html# 被拼接URL以斜線(代表根路徑path)開頭 result = urljoin('http://www.crazyit.org/users/login.html', '/help.html') print(result) # http://www.crazyit.org/help.html# 被拼接URL以雙斜線(代表絕對URL)開頭 result = urljoin('http://www.crazyit.org/users/login.html', '//help.html') print(result) # http://help.html# ============================================================================= # #socket模塊 # #socket模塊 良好的封裝了基于TCP協議的網絡通信,Python使用socket對象來代表兩端的通信端口,并通過socket進行網絡通信 # #socket通信 分為兩端:服務器端 和 客戶端 # #socket通信 通過指定socket類的構造器參數type可指定通信協議類型TCP、UDP等 # #socket通信 基本上是一個信息通道,兩端各有一個程序 # =============================================================================''' 注意: 1、通過指定socket類構造器參數type可指定通信協議類型:TCP協議通信、UDP協議通信 2、socket的TCP協議通信機制提供兩個方法:send 和 recv,分別表示發送和接受數據 3、注意發送與接收數據的 編碼解碼問題 4、socket的UDP協議通信機制提供方法:sendto 和 recvfrom,表示發送和接收數據深入: 1、socket通信的 UDP協議通信 多點廣播原理和實現 需后期繼續深入 http://c.biancheng.net/view/2663.html使用: 一、socket的TCP協議通信的 服務器端 編程的基本步驟: 1、服務器端先創建一個 socket 對象。 2、服務器端 socket 將自己綁定到指定 IP 地址和端口。 3、服務器端 socket 調用 listen() 方法監聽網絡。 4、程序采用循環不斷調用 socket 的 accept() 方法接收來自客戶端的連接。二、socket的TCP協議通信的 客戶端 也是先創建一個 socket 對象,然 后調用 socket 的 connect() 方法建立與服務器端的連接,這樣就可以建立一個基于 TCP 協議的網絡連接。 TCP 通信的客戶端編程的基本步驟大致歸納如下: 1、客戶端先創建一個 socket 對象。 2、客戶端 socket 調用 connect() 方法連接遠程服務器。三、多線程實現socket通信 可實現一個命令行界面的 C/S 聊天室應用,四、socket的UDP協議通信 1、socket.sendto(bytes, address): 發送數據。將 bytes 數據發送到 address 地址。 2、socket.recvfrom(bufsize[, flags]): 接收數據。該方法可以同時返回 socket 中的數據和數據來源地址。''' import socket#################### #探索socket模塊 help(socket) socket.__doc__ socket.__file__ socket.__all__ dir(socket)help(socket.socket) #通過socket類的構造器來創建 socket 實例:#socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)#上面構造器的前三個參數比較重要,其中: #1、family 參數 用于指定網絡類型。 #該參數支持 socket.AF_UNIX(UNIX 網絡)、socket.AF_INET(基于 IPv4 協議的網絡)和 socket.AF_INET6(基于 IPv6 協議的網絡)這三個常量。#2、type 參數 用于指定網絡 Sock 類型。 #type參數可支持 SOCK_STREAM(默認值,創建基于 TCP 協議的 socket)、SOCK_DGRAM(創建基于 UDP 協議的 socket)和 SOCK_RAW(創建原始 socket)。 #一般常用的是 SOCK_STREAM 和 SOCK_DGRAM。 #如果將該參數指定為 SOCK_DGRAM,則意味著創建基于 UDP 協議的 socket。#3、proto 參數 用于指定協議號,如果沒有特殊要求,該參數默認為 0 ,并可以忽略。#################### #常用類、變量、函數help(socket.socket) #socket通信機制,type參數可支持通信協議類型 SOCK_STREAM(默認值,創建基于 TCP 協議的 socket)、SOCK_DGRAM(創建基于 UDP 協議的 socket)和 SOCK_RAW(創建原始 socket)。 dir(socket.socket)help(socket.gethostname) #獲取當前主機名稱 help(socket.socket.bind) #socket的TCP通信服務器端綁定主機/IP、端口方法 help(socket.socket.listen) #socket的TCP通信服務器端監聽方法 help(socket.socket.accept) #socket的TCP通信服務器端接收連接方法help(socket.socket.connect) #socket的TCP通信客戶端連接方法#socket 對象提供了如下常用方法:#1、socket.accept(): 作為服務器端使用的 socket 調用該方法接收來自客戶端的連接。#2、socket.bind(address): #作為服務器端使用的 socket 調用該方法,將該 socket 綁定到指定 address,該 address 可以是一個元組,包含 IP 地址和端口。#3、socket.close(): 關閉連接,回收資源。 #4、socket.connect(address): 作為客戶端使用的 socket 調用該方法連接遠程服務器。 #5、socket.connect_ex(address): 該方法與上一個方法的功能大致相同,只是當程序出錯時,該方法不會拋出異常,而是返回一個錯誤標識符。#6、socket.listen([backlog]): #作為服務器端使用的 socket 調用該方法進行監聽。#7、socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None): #創建一個和該 socket 關聯的文件對象。#8、socket.recv(bufsize[, flags]): #接收socket 中的數據。該方法返回 bytes 對象代表接收到的數據。#9、socket.recvfrom(bufsize[,flags]): #該方法與上一個方法的功能大致相同,只是該方法的返回值是 (bytes, address) 元組。#10、socket.recvmsg(bufsize[, ancbufsize[, flags]]): #該方法不僅接收來自 socket 的數據,還接收來自 socket 的輔助數據,因此該方法的返回值是一個長度為 4 的元組 (data, ancdata, msg_flags, address),其中 ancdata 代表輔助數據。#11、socket.recvmsg_into(buffers[, ancbufsize[, flags]]): #類似于 socket.recvmsg() 方法,但該方法將接收到的數據放入 buffers 中。#12、socket.recvfrom_into(buffer[, nbytes[, flags]]): #類似于 socket.recvfrom() 方法,但該方法將接收到的數據放入 buffer 中。#13、socket.recv_into(buffer[, nbytes[, flags]]): #類似于 recv() 方法,但該方法將接收到的數據放入 buffer 中。#14、socket.send(bytes[, flags]): #向socket 發送數據,該 socket 必須與遠程 socket 建立了連接。該方法通常用于在基于 TCP 協議的網絡中發送數據。#15、socket.sendto(bytes, address): #向 socket 發送數據,該 socket 應該沒有與遠程 socket 建立連接。該方法通常用于在基于 UDP 協議的網絡中發送數據。#16、socket.sendfile(file, offset=0, count=None): #將整個文件內容都發送出去,直到遇到文件的 EOF。#17、socket.shutdown(how):關閉連接。其中 how 用于設置關閉方式。#################### #示例:#最簡單的服務器 #testSocket_hostA.py ''' 使用: #TCP 通信的服務器端編程的基本步驟: #1、服務器端先創建一個 socket 對象。 #2、服務器端 socket 將自己綁定到指定 IP 地址和端口。 #3、服務器端 socket 調用 listen() 方法監聽網絡。 #4、程序采用循環不斷調用 socket 的 accept() 方法接收來自客戶端的連接。 ''' import sockets=socket.socket() #實例化創建socket對象,默認TCP協議類型通信host=socket.gethostname() #獲取計算機全名 port=1234 #指定端口號 s.bind((host,port)) #服務器端首先調用 bind方法綁定主機和端口,注意元組格式 s.listen(2) #服務器端其次調用 listen方法來監聽特定的地址#服務器端采用循環不斷調用socket的accept()方法接收來自客戶端的鏈接 while True:#服務器套接字開始監聽后,就可接受客戶端連接了,使用方法accept來完成.#accept方法將同步阻斷等待 到 客戶端連接到來為止,然后返回一個(client,address)的元組#返回的元組其中client是一個客戶端套接字,address是前面解釋過的地址。c,addr=s.accept() #服務器端接收連接。 開始監聽后,就可接受客戶端連接了,使用方法accept來完成 # print('Got connection from',addr)print(c)print('連接地址:',addr)#注意:傳輸數據,套接字提供兩個方法:send 和 recv,分別表示發送和接受數據#注意發送與接收數據的 編碼解碼問題c.send('您好,您收到了來自服務器的新年祝福。'.encode('utf-8')) #send方法發送數據,提供一個參數為字符串c.close()#注意: #先運行 服務器端,再運行下面 客戶端#示例 #最簡單的客戶端 #testSocket_hostB.py ''' 使用: #TCP 通信的客戶端也是先創建一個 socket 對象,然后調用 socket 的 connect() 方法建立與服務器端的連接,這樣就可以建立一個基于 TCP 協議的網絡連接。 #TCP 通信的客戶端編程的基本步驟大致歸納如下: #1、客戶端先創建一個 socket 對象。 #2、客戶端 socket 調用 connect() 方法連接遠程服務器。 ''' import sockets=socket.socket() #實例化創建socket對象,默認TCP協議類型通信 host=socket.gethostname() #獲取主機名 port=1234 #指定端口號 s.connect((host,port)) #客戶端連接主機和端口 #注意發送與接收數據的 編碼解碼問題 print(s.recv(1024).decode('utf-8')) #recv方法接受數據,提供一個參數為指定最多接受多少個字節的數據#################### #使用: #多線程實現socket的TCP通信 實現一個命令行界面的 C/S 聊天室應用,#服務器端應該包含多個線程,每個 socket 對應一個線程,該線程負責從 socket 中讀取數據(從客戶端發送過來的數據), #并將所讀取到的數據向每個 socket 發送一次(將一個客戶端發送過來的數據“廣播”給其他客戶端),因此需要在服務器端使用 list 來保存所有的 socket。#示例 #testSocket_ThreadA.py #多線程聊天室應用 服務器端import socket import threadingsocket_list=[] #定義保存所有socket的列表ss=socket.socket() #實例化創建socket對象,默認TCP協議類型通信 ss.bind((socket.gethostname(),1235)) #綁定本機主機和端口 ss.listen() #服務器端開始監聽 來自客戶端的鏈接def read_from_client(s):#定義函數,用來嘗試 接收數據,如果沒有接收到數據則說明此通信端關閉,則從列表中刪除此 通信客戶端。try:return s.recv(2048).decode('utf-8')#如果捕獲到異常,則表明該socket對應的客戶端已經關閉,那么就刪除該socketexcept:socket_list.remove(s)def server_target(s):#定義了server_target() 函數,用作線程target參數函數#該函數將會作為線程執行的 target,負責處理每個 socket 的 通信服務器端。try:#循環不斷的從socket中 讀取 來自客戶端發送來的數據while True:content=read_from_client(s)print(content)if content is None:break#當服務器端線程讀取到客戶端數據之后,程序遍歷 socket_list 列表,#并將該數據向 socket_list 列表中的每個 socket 發送一次#(該服務器端線程把從 socket 中讀取到的數據向 socket_list 列表中的每個 socket 轉發一次)for client_s in socket_list:client_s.send(content.encode('utf-8'))except e:print(e.strerror)#循環不斷準備接收來自客戶端的連接,并未每個客戶端啟動一個線程服務 while True:s,addr=ss.accept() #準備接收來自客戶端的連接 此代碼會阻塞socket_list.append(s) #將對應的socket加入socket_list里表中保存,注意理解是對應的socket,然后開始線程開啟。#每當客戶端連接后,啟動一個 線程服務器端 為該 通信客戶端客戶端 服務threading.Thread(target=server_target, args=(s,)).start()#示例 #testSocket_ThreadB.py #多線程聊天室應用 客戶端 可多開客戶端#每個客戶端都應該包含兩個線程, #其中一個 負責讀取用戶的鍵盤輸入內容,并將用戶輸入的數據輸出到 socket 中, #另一個 負責讀取 socket 中的數據(從服務器端發送過來的數據),并將這些數據打印輸出。由程序的主線程負責讀取用戶的鍵盤輸入內容,由新線程負責讀取 socket 數據。import socket import threadings=socket.socket() #實例化創建socket對象,默認TCP協議類型通信 s.connect((socket.gethostname(),1235)) #socket通信客戶端 使用 connect方法鏈接 服務器端def read_from_server(s):#定義一個函數,用作線程target參數函數#該函數實現不斷讀取 接收數據 來自服務器發送的數據while True:print(s.recv(2048).decode('utf-8'))#客戶端啟動一個線程 該線程不斷地讀取來自 服務器端的數據 threading.Thread(target=read_from_server, args=(s,)).start()#如果程序讀取到用戶的鍵盤輸入內容,則將內容發送到服務器端 while True:line=input('')if line is None or line=='exit':break#將用戶的鍵盤輸入內容寫入socket服務器端s.send(line.encode('utf-8'))#################### #socket模塊的shutdown(how)方法詳解 #shutdown(how) 關閉方法,該方法可以只關閉 socket 的輸入或輸出部分,用以表示輸出數據已經發送完成。 import socket#shutdown 方法的 how 參數接受如下參數值: #1、SHUT_RD: 關閉 socket 的輸入部分,程序還可通過該 socket 輸出數據。 #2、SHUT_WR: 關閉該 socket 的輸出部分,程序還可通過該 socket 讀取數據。 #3、SHUT_RDWR: 全關閉。該 socket 既不能讀取數據,也不能寫入數據。#示例 #shutdown() 方法的用法。在該程序中服務器端先向客戶端發送多條數據, #當數據發送完成后,該 socket 對象調用 shutdown() 方法來關閉輸出部分, #表明數據發送結束在關閉輸出部分之后,依然可以從 socket 中讀取數據。import sockets=socket.socket() #實例化創建socket對象,默認TCP協議類型通信 s.bind((socket.gethostname(),1236)) #socket通信服務器端 連接當前主機、端口號 s.listen() #socket通信服務器端 開始監聽 skt,addr=s.accept() #socket通信服務器端 開始接收連接 skt.send('服務器的第一行數據'.encode('utf-8')) #socket通信服務器端 發送數據 skt.send('服務器的第二行數據'.encode('utf-8')) #socket通信服務器端 發送數據#關閉該 socket通信服務器端 的輸出部分,程序還可通過該 socket 讀取數據。 skt.shutdown(socket.SHUT_WR) #socket通信服務器端 關閉socket的輸出,表明輸入數據已經結束while True:line=skt.recv(2048).decode('utf-8')if line is None or line=='':breakprint(line)skt.close() s.close()''' 程序中,關閉了 socket 的輸出部分,此時該 socket 并未被徹底關閉, 程序只是不能向該 socket 中寫入數據了,但依然可以從該 socket 中讀取數據。當調用 socket 的 shutdown() 方法關閉了輸入或輸出部分之后,該 socket 無法再次打開輸入或輸出部分, 因此這種做法通常不適合保持持久通信狀態的交互式應用,只適用于一站式的通信協議, 例如 HTTP 協議,即客戶端連接到服務器端,開始發送請求數據,當發送完成后無須再次發送數據, 只需要讀取服務器端的響應數據即可,當讀取響應數據完成后,該 socket 連接就被完全關閉了。 '''#################### #socket基于UDP協議通信發送和接收數據 及 UDP多點廣播#程序在創建 socket 時,可通過 type 參數指定該 socket 的類型,如果將該參數指定為 SOCK_DGRAM,則意味著創建基于 UDP 協議的 socket。 #在創建了基于UDP 協議的 socket 之后,程序可以通過如下兩個方法來發送和接收數據: #1、socket.sendto(bytes, address): 發送數據。將 bytes 數據發送到 address 地址。 #2、socket.recvfrom(bufsize[, flags]): 接收數據。該方法可以同時返回 socket 中的數據和數據來源地址。#UDP 協議進行網絡通信時,實際上并沒有明顯的服務器端和客戶端,因為雙方都需要先建立一個 socket 對象,用來接收或發送數據報。 #但在實際編程中,通常具有固定 IP 地址和端口的 socket 對象所在的程序被稱為服務器,因此該 socket 應該調用 bind() 方法被綁定到指定 IP 地址和端口,這樣其他 socket(客戶端 socket)才可向服務器端 socket(綁定了固定 IP 地址和端口的 socket)發送數據報,而服務器端 socket 就可以接收這些客戶端數據報。########## #示例: #UDP 協議的 socket 實現 C/S 結構的網絡通信 #本程序的服務器端通過循環 1000 次來讀取 socket 中的數據報,每當讀取到內容之后,便向該數據報的發送者發送一條信息。 #服務器端 socket的UDP協議通信 #testSocketUDP_A.py import socketbooks=('血皇敖天','劍皇霸天',\'水心云影','寒天晴嵐') #定義字符串數組,準備用來 服務器端發送該數據的元素s=socket.socket(type=socket.SOCK_DGRAM) #實例化創建socket通信,指定通信協議為UDP協議 s.bind((socket.gethostname(),3000)) #socket通信 服務器端 綁定主機、端口號for i in range(1000):#socket的 UDP協議通信的 recvfrom方法 接收數據 可以同時返回 socket 中的數據 和 數據來源地址。data,addr=s.recvfrom(4096) #接收數據,返回數據 和 來源地址 #4096定義每個數據報的大小最大為4KBprint(data.decode('utf-8'))send_data=books[i % 4].encode('utf-8') #求余 定義socket通信服務器端 發送數據內容#socket的 UDP協議通信的 sendto方法 發送數據 到指定地址s.sendto(send_data, addr) #發送數據,到指定地址 s.close()#先運行服務器端,再運行客戶端#客戶端程序的代碼與服務器端類似, #客戶端采用循環不斷地讀取用戶的鍵盤輸入內容,每當讀取到用戶輸入的內容后,就將該內容通過數據報發送出去;接下來再讀取來自 socket 中的信息(也就是來自服務器端的數據)。 #客戶端 socket的UDP洗衣通信 #testSocketUDP_B.py import sockets=socket.socket(type=socket.SOCK_DGRAM) #實例化創建socket通信,指定通信協議為UDP協議while True:line=input('')if line is None or line=='':breakdata=line.encode('utf-8')#socket的 UDP協議通信的 sendto方法 發送數據 到指定地址s.sendto(data,(socket.gethostname(),3000))#recv不同于recvfrom#socket的 UDP協議通信的 recvfrom方法 接收數據 可以同時返回 socket 中的數據 和 數據來源地址。data=s.recv(4096)print(data.decode('utf-8')) s.close()########## #UDP多點廣播 #多點廣播 可以將數據報以廣播方式式發送到多個客戶端。 #多點廣播 則需要將數據報發送到一個組目標地址,當數據報發出后,整個組的所有主機都能接收到該數據報。 #每一個多點廣播地址都被看作一個組,當客戶端需要發送和接收廣播信息時,加入該組即可#注意: #DDP多點廣播 #創建了 socket 對象后,還需要將該 socket 加入指定的多點廣播地址中,socket 使用 setsockopt() 方法加入指定組。 #如果創建僅用于發送數據報的 socket 對象,則使用默認地址、隨機端口即可。 #但如果創建接收數據報的 socket 對象,則需要將該 socket 對象綁定到指定端口;否則,發送方無法確定發送數據報的目標端口。import socket#setsockopt()方法 加入指定組 help(socket.socket.setsockopt)help(socket.IPPROTO_IP) help(socket.IP_MULTICAST_TTL)help(socket.SOL_SOCKET) help(socket.SO_REUSEADDR)help(socket.IP_ADD_MEMBERSHIP) help(socket.inet_aton)#支持多點廣播的 socket 還可設置廣播信息的 TTL(Time-To-Live), #該 TTL 參數用于設置數據報最多可以跨過多少個網絡: #1、當TTL的值為 0 時, 指定數據報應停留在本地主機中; #2、當TTL的值為 1 時, 指定將數據報發送到本地局域網中; #3、當TTL 的值為 32 時, 意味著只能將數據報發送到本站點的網絡上; #4、當TTL 的值為 64 時, 意味著數據報應被保留在本地區; #5、當TTL 的值為 128 時, 意味著數據報應被保留在本大洲; #6、當TTL 的值為 255 時, 意味著數據報可被發送到所有地方;#注意:UDP多點廣播 需后期繼續深入# ============================================================================= # #selectors 模塊 # #selectors 模塊允許 socket 以非阻塞方式進行通信。# #selectors 相當于一個事件注冊中心,程序只要將 socket 的所有事件注冊給 selectors 管理,當 selectors 檢測到 socket 中的特定事件之后,程序就調用相應的監聽方法進行處理。 # #selectors 主要支持兩種事件: # #1、selectors.EVENT_READ:當 socket 有數據可讀時觸發該事件。當有客戶端連接進來時也會觸發該事件。 # #2、selectors.EVENT_WRITE:當 socket 將要寫數據時觸發該事件。 # =============================================================================''' 注意: 1、selectors模塊使用sel的register方法注冊函數,然后使用select方法獲取注冊事件來準備調用注冊函數, 這樣以代替常規阻塞式通信的的accept方法循環 send發送數據 及 recv接收數據。使用: 一、selectors模塊 實現非阻塞式編程的步驟大致如下: 1、創建 selectors 對象。 2、通過 selectors 對象為 socket 的 selectors.EVENT_READ 或 selectors.EVENT_WRITE 事件注冊監聽器函數。每當 socket 有數據需要讀寫時,系統負責觸發所注冊的監昕器函數。 3、在監聽器函數中處理 socket 通信。'''import selectorshelp(selectors) selectors.__doc__ selectors.__file__ dir(selectors)help(selectors.EVENT_READ) dir(selectors.EVENT_READ)help(selectors.EVENT_WRITE) dir(selectors.EVENT_WRITE)#################### #常用類及屬性help(selectors.DefaultSelector()) #默認的selectors對象,實例化創建后 可以調用 類方法 進行事件注冊 dir(selectors.DefaultSelector) #默認的selectors對象,實例化創建后 可以調用 類方法 進行事件注冊help(selectors.DefaultSelector.register) #注冊事件 help(selectors.DefaultSelector.unregister) #取消注冊事件 help(selectors.DefaultSelector.select) #獲取注冊事件,返回列表(key,events)################### #示例 ########## #使用selectors模塊實現非阻塞式socket通信服務器端程序 #服務器端: import selectors, socket#實例化創建selectors的默認對象,然后可以調用 類方法sel.register() 進行事件注冊。 sel=selectors.DefaultSelector() #創建默認的selectors對象 socket_list=[]def read(skt, mask):'''負責監聽"有數據可讀"事件的函數嘗試:如果讀取到數據則將讀取到的數據發送給每個socket通信客戶端,否則就是通信退出 則關閉該socket通信客戶端,并從列表中刪除。異常:則 取消 socket通信客戶端 的 注冊事件,并關閉該socket通信客戶端,并將其從列表中刪除。參數skt 為一個socket通信客戶端連接。'''#嘗試:讀取數據,并將讀取到的數據發送給每個socket_listtry:data=skt.recv(1024)#如果讀取到數據,則將數據循環發送給每個socket_listif data:for s in socket_list:s.send(data)#如果沒有讀取到數據,則 關閉 socket的通信客戶端連接 并 從socket_list中刪除此 該通信客戶端連接else:print('關閉',skt)skt.close() #socket的通信客戶端關閉socket_list.remove(skt) #從列表中刪除socket的通信客戶端#如果異常:將該socket關閉,并從socket_list列表中刪除except:print('關閉',skt)#取消注冊事件sel.unregister(skt) #取消skt的注冊事件skt.close() #socket的通信客戶端關閉socket_list.remove(skt) #從列表中刪除socket的通信客戶端def accept(sock, mask):'''負責監聽“有客戶端連接進來”事件的函數'''conn,addr=sock.accept() #socket通信服務器端 準備接收 客戶端連接socket_list.append(conn) #socket_list添加保存接收到的 socket通信客戶端conn.setblocking(False) #設置socket為非阻塞式#sel.register類方法 注冊事件 #即:為conn的READ事件注冊監聽函數read,用來讀取后循環輸出給每一個socket通信客戶端。sel.register(conn, selectors.EVENT_READ, read) #函數內注冊READ事件監聽函數read#創建socket通信服務器端的順序步驟 sock=socket.socket() #實例化創建通信 sock.bind((socket.gethostname(), 1236)) #socket通信服務器端 綁定本機主機名、端口號 sock.listen() #執行監聽 sock.setblocking(False) #設置該socket是非阻塞式的#注意:使用sel的register注冊方法注冊函數,然后使用select方法獲取注冊事件來調用注冊函數, #這樣以代替常規阻塞式通信的的accept方法循環 send發送數據 及 recv接收數據。#使用sel為 sock的EVENT_READ事件 注冊read監聽函數 sel.register(sock, selectors.EVENT_READ, accept) #為對象sock注冊事件函數 即為socket服務器端注冊監聽函數事件 #register(self, fileobj, events, data=None)#采用死循環方式 不斷提取sel的事件 while True:#sel.select()類方法 獲取注冊事件 返回列表結構 元素包含兩個內容(key,events)events=sel.select()for key,mask in events:#key的data屬性 獲取為該事件注冊的監聽函數callback=key.data#key的fileobj屬性 獲取被監聽的socket對象callback(key.fileobj, mask) #執行key.data獲取到的監聽函數########## #使用selectors模塊實現非阻塞式socket通信客戶端程序 #客戶端: import selectors, socket, threadingsel=selectors.DefaultSelector() #創建默認的selectors對象def read(conn, mask):data=conn.recv(1024)if data:print(data.decode('utf-8'))else:print('closing', conn)sel.unregister(conn)conn.close()s=socket.socket() #創建socket對象 s.connect((socket.gethostname(),1236)) #socket通信客戶端 連接 本機主機名、端口 s.setblocking(False) #設置該socket為非阻塞式#使用sel為 s 的EVENT_READ事件 注冊 read監聽函數 sel.register(s, selectors.EVENT_READ, read) def keyboard_input(s):while True:line=input('')if line is None or line=='exit':breaks.send(line.encode('utf-8')) #創建線程執行函數 threading.Thread(target=keyboard_input, args=(s,)).start()while True:#sel.select()類方法 獲取注冊事件 返回列表結構 元素包含兩個內容(key,events)events=sel.select()for key,mask in events:#key的data屬性 獲取為該事件注冊的監聽函數 callback=key.data#key的fileobj屬性 獲取被監聽的socket對象callback(key.fileobj, mask) #執行key.data獲取到的監聽函數

總結

以上是生活随笔為你收集整理的Py网络编程及应用(urllib、socket/selectors)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产视频在线观看一区 | 国产剧情在线一区 | 国产三级精品三级在线观看 | 天天操婷婷 | 国产精品自产拍在线观看中文 | 天天干天天干天天色 | 久久99久| 久久久国产精品久久久 | 国产精品99精品 | 久久久久久久免费 | 五月天综合婷婷 | 天天激情 | 亚a在线 | 午夜精品一区二区三区免费视频 | 午夜私人影院 | 九九热在线播放 | 日韩大片在线免费观看 | 国产在线精品国自产拍影院 | 激情视频一区二区三区 | 九九九热精品免费视频观看网站 | 狠狠色丁香婷婷综合久小说久 | 日本黄色免费网站 | 人人草网站 | 日韩精品短视频 | 黄色毛片视频免费 | 色婷婷欧美 | 丁香九月激情 | 久久66热这里只有精品 | 日韩欧美电影在线 | 在线观看mv的中文字幕网站 | 99久久激情视频 | av免费观看高清 | 婷婷深爱五月 | 91人人澡人人爽人人精品 | 91av在线播放视频 | 久久久久中文字幕 | 中文字幕在线播放日韩 | 国产精品www | 久久99精品国产麻豆宅宅 | 亚洲一区av | 国精产品满18岁在线 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 日韩成人黄色av | 91精品国产自产在线观看 | av一本久道久久波多野结衣 | 91久久国产综合精品女同国语 | 九九热在线观看 | 天天操天天色天天 | 日本动漫做毛片一区二区 | 久久久久久久久久久久久9999 | 欧美激情第28页 | 欧美性脚交 | 亚洲国产中文字幕在线观看 | 五月婷婷在线观看视频 | 日日躁夜夜躁xxxxaaaa | 久久久久五月 | 日韩乱码在线 | 久久久在线视频 | 久久不射电影院 | 欧美一级专区免费大片 | 中文字幕在线免费97 | 国产91精品在线播放 | 国产精品欧美久久久久天天影视 | 免费网站看v片在线a | 亚洲狠狠干| 国产探花视频在线播放 | 久久 亚洲视频 | 亚洲黄色免费在线看 | 午夜视频在线观看一区二区 | 美女av在线免费 | 91视频啪 | 日韩精品欧美精品 | 99精品在这里 | 成人免费在线观看电影 | 国产精品欧美激情在线观看 | 香蕉视频国产在线观看 | 国产精品女人网站 | 精品91视频| 亚洲理论电影网 | 欧美日韩视频一区二区 | 处女av在线| 久久久久久高潮国产精品视 | 国语精品久久 | 国产精品久久电影网 | 婷婷中文字幕综合 | 亚洲免费观看视频 | 欧美巨乳网 | 国产福利在线免费 | 色午夜 | 日韩av不卡在线 | 一区二区三区免费播放 | 国产一区二区三区高清播放 | 日韩国产精品久久久久久亚洲 | 婷婷五月情 | 四虎国产永久在线精品 | 国产字幕在线观看 | 欧美日韩a视频 | 欧美成天堂网地址 | 亚洲在线看 | 天天看天天干 | 色婷婷视频在线观看 | av电影免费在线 | 国产在线观看中文字幕 | 日韩免费在线观看 | 毛片.com| 国产成人免费在线观看 | 国产精品麻豆三级一区视频 | 国内久久精品 | 狠狠狠色丁香婷婷综合激情 | 18久久久| 免费 在线 中文 日本 | 91在线www| 国产尤物在线视频 | 日本精品一区二区三区在线播放视频 | 99在线免费视频观看 | 中文字幕一区二区三区四区在线视频 | 91网在线| 国产中文字幕在线视频 | 欧美日韩免费一区二区三区 | 久久精品视频在线 | 久草影视在线观看 | 亚洲精品国产精品乱码不99热 | 日本久久中文 | 日韩精品视频久久 | 操久久免费视频 | 精品麻豆入口免费 | 99精品免费视频 | 久久久亚洲麻豆日韩精品一区三区 | 五月婷社区 | 免费在线观看的av网站 | 国产精品你懂的在线观看 | 中文字幕色婷婷在线视频 | 免费av黄色| 毛片网在线播放 | 九九激情视频 | 国产福利中文字幕 | 热久久影视 | 午夜久久成人 | 中文字幕色婷婷在线视频 | 在线国产能看的 | 91超级碰碰 | 日韩在线精品一区 | 日韩欧美精品在线观看视频 | www.亚洲精品视频 | 中文字幕亚洲欧美日韩2019 | 99精品视频在线观看 | 日韩素人在线观看 | 国产精品久久久久久久av电影 | 午夜电影中文字幕 | 欧美激情第十页 | 三级在线播放视频 | 天天超碰 | 国产在线黄 | 欧美色久 | 精品久久久久久久久久国产 | 97免费在线观看视频 | 人人爽人人爱 | 成人av在线电影 | 精品国产aⅴ麻豆 | 一级α片免费看 | 亚洲成年片 | 欧美韩国日本在线 | 国产不卡在线视频 | 在线观看免费一区 | 五月天狠狠操 | 成人毛片在线观看 | 久久污视频 | av免费观看高清 | 五月婷婷一区二区三区 | 久精品视频免费观看2 | 青青河边草观看完整版高清 | 欧洲一区精品 | 亚洲另类在线视频 | 91最新在线 | 国产精品自产拍在线观看桃花 | 一级成人在线 | 国产丝袜高跟 | av国产在线观看 | 四虎影视www | 天天做日日做天天爽视频免费 | 日韩特级黄色片 | 精品网站999www | 97韩国电影| 在线视频免费观看 | 久久久久久久久久久久久国产精品 | av天天草 | 草免费视频 | 国产韩国日本高清视频 | 欧洲精品久久久久毛片完整版 | 九九热免费观看 | 888av| 国产精品久久久久久久久久久不卡 | 免费看黄色小说的网站 | 欧美日韩在线观看不卡 | 欧美久久久久久久久 | 69国产成人综合久久精品欧美 | 欧美日韩在线精品 | 97av在线视频 | 久久综合久久综合九色 | 久久综合中文色婷婷 | 国产精品视频在线看 | 久草在线视频首页 | 又大又硬又黄又爽视频在线观看 | 久久美女免费视频 | 九九热免费在线视频 | 日日婷婷夜日日天干 | 毛片永久新网址首页 | 久久99国产视频 | 久久爱992xxoo | 天天做天天爱天天爽综合网 | 亚洲电影av在线 | 高清免费av在线 | 亚洲黄色a| 蜜臀av夜夜澡人人爽人人 | 精品96久久久久久中文字幕无 | 午夜视频欧美 | 日韩特级黄色片 | 精品96久久久久久中文字幕无 | 日本电影黄色 | 色综合 久久精品 | 国产精品理论视频 | 欧美日韩大片在线观看 | 久久综合给合久久狠狠色 | 日韩va在线观看 | 欧美成人一区二区 | 在线观看国产高清视频 | 月丁香婷婷 | 国产特级毛片aaaaaaa高清 | 色国产视频| a级国产乱理伦片在线播放 久久久久国产精品一区 | 免费看一级黄色 | 国产一区二区三区免费观看视频 | 91精品成人 | 日本3级在线观看 | 区一区二区三在线观看 | 欧美日韩精| 狠狠干中文字幕 | 91色在线观看| 久久蜜桃av | 碰超人人 | 丁香婷婷色月天 | av在线播放快速免费阴 | 亚洲国产精品久久久久 | 99精品国产视频 | avove黑丝| 五月天亚洲婷婷 | 91香蕉视频污在线 | 国产在线国偷精品产拍免费yy | 人人看97| 国产精品手机在线 | 日本护士三级少妇三级999 | 国产在线看| 亚洲干| 国产一区二区三区 在线 | 91九色蝌蚪视频网站 | 手机看片久久 | 久久蜜臀av | 日韩精品偷拍 | 一区二区三区久久精品 | 久久久久久久久久久久电影 | 色五月激情五月 | 91精品黄色 | 久操伊人 | 亚洲区另类春色综合小说 | 免费国产视频 | av免费观看网址 | 高清精品久久 | 国产一区黄色 | 中文字幕一区二区三区在线观看 | 三级黄色网络 | 夜夜骑首页 | 亚洲精品久久激情国产片 | 三上悠亚一区二区在线观看 | 美女中文字幕 | 97精品国产91久久久久久久 | 九九热1 | 日韩专区视频 | 国产三级香港三韩国三级 | 国产精品毛片一区二区三区 | 夜夜夜| 999国内精品永久免费视频 | 日韩视频免费观看高清 | 视频在线观看日韩 | 成人久久| 国产午夜av | 99精品免费久久久久久久久 | 又色又爽又黄 | 18网站在线观看 | av成人免费 | 国产伦理精品一区二区 | 久久久久久久久久久久影院 | 中文字幕在线免费看线人 | 色婷婷亚洲婷婷 | 91成人在线观看高潮 | 精品国内自产拍在线观看视频 | 91av在线视频免费观看 | 五月婷婷在线播放 | 久久久999 | 在线观看va| 亚洲午夜精品久久久 | 99久久精品免费看国产免费软件 | 久久av影院 | 亚洲一区二区91 | 黄色毛片视频免费观看中文 | 欧美亚洲一级片 | 久视频在线| 国产成人精品av | 人人爽人人香蕉 | 国产免费一区二区三区最新6 | 国产一级一片免费播放放 | 一区二区三区在线电影 | 麻豆国产网站入口 | 国产精品18久久久久久久久 | 欧美日韩在线观看一区二区 | 欧美激情第28页 | 国产精品久久久久久久7电影 | 久久综合婷婷国产二区高清 | 久久综合久久综合九色 | 久久精品牌麻豆国产大山 | 久久不射影院 | 午夜影视一区 | 亚洲精品99久久久久久 | 波多野结衣在线观看视频 | 精品在线观看免费 | 高清在线一区二区 | av福利资源 | 国产成人久久精品77777综合 | 国产精品理论片在线播放 | 国产成人精品一区二区三区网站观看 | 成人久久综合 | 日韩中文字幕免费在线观看 | 精品国产a | www黄免费| 日本乱视频 | 久久国内免费视频 | 17videosex性欧美 | 黄网站app在线观看免费视频 | 久久激情五月丁香伊人 | 亚洲精品h| 在线久草视频 | 久久综合之合合综合久久 | 国产中文字幕视频在线 | 国产资源在线播放 | 国产亚洲资源 | 欧美日韩国产二区三区 | 国产精品久久久av | 亚洲精品美女久久久久 | 久草a视频| 日韩伦理一区二区三区av在线 | 四虎国产精品永久在线国在线 | 高清精品久久 | 日本精品久久久久影院 | 五月花丁香婷婷 | 色99久久| 五月开心六月婷婷 | 午夜精品一区二区三区视频免费看 | 欧美黄色特级片 | 六月色婷婷 | 亚洲综合色丁香婷婷六月图片 | 日韩网站免费观看 | 玖玖精品视频 | 国产一区二区久久久 | 国内精品久久久精品电影院 | 91精品国产自产91精品 | 日本婷婷色 | 精品国产视频在线 | 久久国产免费 | 99免费看片| www.亚洲在线 | 日韩在线高清视频 | 久久人网| 免费观看成人网 | 97色综合| 欧美日韩xx | 黄色网址在线播放 | 国产精品美女久久久久久网站 | 婷婷色五 | 狠狠狠干狠狠 | 人人干狠狠操 | 麻豆视频国产在线观看 | 国产免费叼嘿网站免费 | 久久香蕉电影 | 国产在线观看国语版免费 | 日韩一区二区三区免费视频 | 亚洲午夜精品久久久久久久久 | 视色网站 | 911精品视频 | 日日操操 | 国内精品福利视频 | 亚洲国产精品第一区二区 | 综合伊人av | 午夜在线国产 | 欧美91片| 日韩在线观看免费 | 麻豆精品国产传媒 | 91亚洲精品乱码久久久久久蜜桃 | 精品国产区 | 婷婷深爱五月 | 亚洲,国产成人av | 久久久国产99久久国产一 | 国产精品美女视频 | 国产美女免费观看 | 特级大胆西西4444www | 成人av电影网址 | 麻豆久久 | 久久免费视频3 | 国产在线精品一区二区三区 | 超碰在线人人爱 | 激情视频免费在线观看 | 一区二区三区精品久久久 | 最新影院 | 国产色视频网站2 | 97视频免费在线观看 | 一级久久久 | av不卡免费在线观看 | 中文字幕免费高清在线 | 免费视频91| 日韩欧美网址 | 少妇自拍av | 成人网看片 | 一区二区三区日韩在线观看 | 在线成人免费 | 国产精品va在线观看入 | 国产日韩高清在线 | 亚洲精品国偷拍自产在线观看 | 日日综合网 | 97超碰资源| 96精品视频| 欧美日韩另类视频 | 日韩精品视频在线观看免费 | 96看片 | 色99之美女主播在线视频 | 亚洲在线资源 | 国产第一页在线观看 | 成人久久免费 | 色婷婷在线视频 | 中文字幕在线播放日韩 | 91污视频在线观看 | 精品免费久久久久久 | 日韩免费视频一区二区 | 日韩在线视 | 在线一二三区 | 亚洲精品乱码久久久一二三 | 久久久国产精品网站 | av在线网站免费观看 | 视频在线日韩 | 国产精品麻豆果冻传媒在线播放 | 国产精品成人在线 | 天天激情综合网 | 97超级碰| 日韩在线一二三区 | 天天透天天插 | 日本三级不卡视频 | 国产精品久久久久久麻豆一区 | 夜夜干天天操 | 国产69精品久久久久9999apgf | 在线日本看片免费人成视久网 | 最新中文字幕在线资源 | 欧美一区二区三区免费观看 | 久久夜夜夜 | 免费国产在线视频 | 91久久爱热色涩涩 | 久热免费 | 亚洲最大的av网站 | 亚洲日本va在线观看 | 天天操天天操天天操天天操 | 国产精品日韩 | 国产色拍拍拍拍在线精品 | 国产成人精品亚洲精品 | 久久久久久毛片精品免费不卡 | 亚洲理论片 | 久久精品亚洲综合专区 | 美女天天操 | 公开超碰在线 | a天堂一码二码专区 | 91亚洲精品视频 | 色婷婷色| 一区二区精品在线 | 999视频网| 狠狠gao| 91精品国产一区二区在线观看 | 操操爽 | 精品麻豆入口免费 | 99热在线观看 | 天天插综合 | 国产精品免费观看国产网曝瓜 | 911免费视频 | 高清在线一区 | 色噜噜日韩精品欧美一区二区 | 国产精品1区2区在线观看 | www黄色av | 成人久久视频 | 狠狠色噜噜狠狠狠合久 | 亚洲乱码久久久 | 人人爱天天操 | 成人在线免费av | 久久精品福利视频 | 国产精品在线看 | 国产精品色视频 | 亚洲精品中文在线观看 | 亚洲视频一 | 精品免费视频. | 日韩中文字幕亚洲一区二区va在线 | 亚洲春色综合另类校园电影 | 久久伦理电影网 | 91色综合 | 激情影音 | av片中文字幕 | 亚州视频在线 | 国产一区欧美一区 | 亚洲精品午夜久久久久久久 | 在线影视 一区 二区 三区 | 精品a视频 | 国产a级片免费观看 | 欧美a影视 | 日韩视频 一区 | 在线中文字母电影观看 | 综合色伊人 | 日韩中文字幕免费电影 | 中文字幕久久精品一区 | 中文字幕在线看视频国产中文版 | 亚洲高清免费在线 | 亚洲综合小说电影qvod | 中文字幕在线观看不卡 | 日韩精品一区二区三区三炮视频 | 99国产视频 | 青草视频在线 | 99视频+国产日韩欧美 | 五月天婷婷丁香花 | 97在线观看免费观看 | 久久久久国产精品午夜一区 | 久久精品视频在线免费观看 | 热久久这里只有精品 | 国产91全国探花系列在线播放 | 91久久精品一区二区三区 | av再线观看 | 亚洲激精日韩激精欧美精品 | 久久草视频 | www视频免费在线观看 | 日日干天天射 | 国产999精品久久久久久绿帽 | 国产欧美在线一区二区三区 | 亚州激情视频 | 伊人久久av | 精品国产免费久久 | 亚洲美女在线国产 | 91在线成人 | 国产打女人屁股调教97 | 欧美日韩午夜 | 玖玖玖精品 | 免费看精品久久片 | 国产亚洲视频在线观看 | 亚洲精品看片 | 日韩免费中文字幕 | 久久国产精品久久w女人spa | 狠狠干五月天 | 亚洲免费av网站 | 在线日韩av | 91亚洲精品久久久蜜桃 | 精品国产免费一区二区三区五区 | 亚洲丝袜一区 | 麻豆一级视频 | 黄色网中文字幕 | 免费在线观看av的网站 | av一级片在线观看 | 久久久久99精品成人片三人毛片 | 91视频啪 | 日本爽妇网 | 欧美精品二区 | 久久精品伊人 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 美女网站在线免费观看 | 亚洲精品中文在线资源 | 中文视频在线播放 | 黄网站色欧美视频 | 五月av在线 | 久久久久久久久久久精 | 日韩亚洲在线 | 国产高清在线观看 | a天堂最新版中文在线地址 久久99久久精品国产 | 四虎影视成人永久免费观看亚洲欧美 | 99久久精品免费看国产免费软件 | 97超碰国产精品 | 中文字幕av网站 | 久久艹国产视频 | 久久99精品久久久久婷婷 | 91入口在线观看 | 亚洲理论电影 | 成人免费中文字幕 | 中文乱幕日产无线码1区 | 日韩精品亚洲专区在线观看 | 国内精品视频一区二区三区八戒 | 在线观看视频你懂的 | 69精品人人人人 | 中文字幕第一页在线vr | 日韩精品一区二区三区中文字幕 | 欧美日韩不卡在线观看 | 亚洲毛片久久 | 久久人人爽av| 日韩av成人在线观看 | 国产一级二级三级视频 | 久久久国产精品电影 | 国产永久免费观看 | 99久久综合国产精品二区 | 国产精品久久久久永久免费看 | 五月综合婷 | 天天干.com | 99视频在线免费观看 | 国产精品美女久久久久久网站 | 99色精品视频 | 久草视频首页 | 4hu视频 | 美女天天操 | 四虎影视成人永久免费观看视频 | 日本久久99 | 国产精品igao视频网网址 | 国产精品区在线观看 | 91免费高清视频 | 日日夜夜天天久久 | 天天鲁天天干天天射 | 欧美大片大全 | 99精品视频在线观看播放 | 欧美一级电影片 | 在线a视频免费观看 | 美女视频永久黄网站免费观看国产 | 91人网站 | 精品在线99 | 国产精品一区二区久久久久 | 天天骚夜夜操 | 九九免费在线看完整版 | www.av在线.com| 亚洲波多野结衣 | 成人久久久久久久久 | 99在线视频免费观看 | 六月色婷 | 婷婷在线播放 | 国产福利精品在线观看 | 国产一区二区观看 | 国产黄色片在线免费观看 | 久久久官网 | 欧美久久久久久久久中文字幕 | 国产区精品在线 | 国产精品视频99 | 毛片精品免费在线观看 | 日韩成人黄色 | 欧美日韩在线第一页 | 中文字幕在线观看视频一区二区三区 | 亚洲精品动漫成人3d无尽在线 | 六月激情婷婷 | 97精品国产一二三产区 | 全黄网站 | 四虎影视国产精品免费久久 | 91色在线观看 | 国产中文字幕av | 欧美精品一区二区三区四区在线 | 97偷拍在线视频 | 中文字幕在线播放第一页 | 亚洲一区视频免费观看 | 久久影院午夜论 | 91精品视频在线免费观看 | 色综合久久网 | 日韩欧美精品一区二区三区经典 | 91精品国产入口 | 亚洲性少妇性猛交wwww乱大交 | 国产在线欧美在线 | 综合精品久久 | 人人草在线视频 | 成人午夜在线电影 | a午夜在线 | 国内精品久久久久国产 | 日韩精品一区二区在线观看视频 | 91一区啪爱嗯打偷拍欧美 | 丁香六月伊人 | 欧美a在线免费观看 | 免费视频一二三区 | 日韩精品极品视频 | 日本性视频 | 成人精品一区二区三区中文字幕 | www.色婷婷.com| 色九九影院 | 欧美黑人猛交 | 欧洲亚洲精品 | 日本黄色黄网站 | 日韩欧美有码在线 | 丝袜美腿一区 | www色综合 | www.888.av| www.色婷婷| 香蕉免费在线 | 97精品国产97久久久久久 | 亚洲 中文 欧美 日韩vr 在线 | 日韩视频中文字幕在线观看 | 成人午夜电影网站 | 中文字幕在线网址 | 色a网| 国产视频一区二区三区在线 | 亚洲成av人片一区二区梦乃 | 中文字幕久久亚洲 | 亚洲永久精品在线观看 | 欧美日韩中文在线观看 | 欧洲精品视频一区二区 | 免费观看www7722午夜电影 | 911国产精品 | 国产一区不卡在线 | 日韩欧美高清视频在线观看 | 国产精品123 | 亚洲欧美视频网站 | 欧美激情亚洲综合 | 国产精品系列在线观看 | 91av在线免费 | 亚洲永久av | 视频 国产区| 久久男人中文字幕资源站 | 成人a视频在线观看 | 性日韩欧美在线视频 | 91丨九色丨国产丨porny精品 | 在线观看黄色大片 | 欧美精品久久久久a | 中文字幕a∨在线乱码免费看 | 国产高清在线看 | 久久久一本精品99久久精品66 | 国产69精品久久久久9999apgf | 精品国产欧美一区二区三区不卡 | 亚洲精品日韩av | 国产精品区在线观看 | 国产精品男女 | 亚洲精品综合一区二区 | 天天操 夜夜操 | 欧洲成人免费 | 精品国产乱码一区二 | 亚洲精品欧洲精品 | 欧美精品久久久久久久久久丰满 | 国产精品一区二区电影 | 亚洲综合在线五月天 | 久久精品中文字幕一区二区三区 | 美女视频网站久久 | 久久超碰97| 五月天视频网站 | 香蕉影院在线观看 | 久草国产在线 | 91精品免费在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 国产精品热视频 | 亚洲精品乱码久久久久久久久久 | 亚洲japanese制服美女 | 久久午夜精品影院一区 | 久久久久久久影视 | av网站地址 | 成人av网站在线 | 久久久久国产免费免费 | 亚洲 欧美 日韩 综合 | 三级黄免费看 | 青青河边草观看完整版高清 | 国产不卡一二三区 | 欧美日韩一区二区三区不卡 | 欧美精选一区二区三区 | 免费在线观看不卡av | 欧美激精品 | 香蕉91视频 | 国产精品videossex国产高清 | 色婷婷成人网 | 天天要夜夜操 | 久草在线免费看视频 | wwwwww色| 久久综合九九 | 免费在线观看不卡av | 久久国产亚洲视频 | 国产大片黄色 | 欧美日韩大片在线观看 | 在线免费中文字幕 | 91精品国产综合久久婷婷香蕉 | 免费成人结看片 | 最新国产在线 | 美女一二三区 | 99久久999久久久精玫瑰 | 夜色成人网 | 国产精品美女久久久久久久久 | 国内精品免费 | 91激情视频在线观看 | 91九色国产蝌蚪 | 日韩美一区二区三区 | 午夜在线免费观看视频 | 97在线观看视频 | 国产电影一区二区三区四区 | 在线免费观看av网站 | 成人精品国产 | 超碰在线日韩 | 日韩av有码在线 | 2023年中文无字幕文字 | 成人 国产 在线 | 91九色在线视频 | 最新三级在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 男女靠逼app | 男女激情免费网站 | 9草在线 | 免费在线观看不卡av | 国产高清视频在线观看 | 成人91在线| 91丨九色丨丝袜 | 亚洲在线免费视频 | 天天天天综合 | 国产成人在线精品 | 久久免费公开视频 | 久久精品资源 | 午夜10000 | 丁香5月婷婷 | 久久精品一区二区三区四区 | 国产高清第一页 | 久久久久久激情 | 亚洲天堂网在线观看视频 | 日韩在线精品视频 | 日本精品va在线观看 | 狠狠操夜夜操 | 日操干| 夜夜躁日日躁狠狠久久88av | 国产无区一区二区三麻豆 | 色综合激情久久 | 天天干天天干天天 | 久草在线91| 91人人人 | 九九久久精品视频 | 一区二区三区精品久久久 | 久久国产美女 | 日韩精品一区二区三区在线视频 | 又黄又爽免费视频 | 亚洲激情综合 | 久久精品99国产精品亚洲最刺激 | 国产自产高清不卡 | 亚洲日韩中文字幕 | 99精品视频免费 | 不卡的av在线播放 | 亚洲国产69 | 天天操天天干天天爱 | 亚洲欧洲国产精品 | 日韩视频免费 | 麻豆免费观看视频 | 久久久久久久久久电影 | 亚洲另类视频 | 首页av在线 | www.夜夜骑.com | 中文字幕免费播放 | 成人在线一区二区 | 日韩有码网站 | 日本中文在线 | 96av麻豆蜜桃一区二区 | 九七在线视频 | 激情婷婷av | 国产一区二区三区在线免费观看 | 日本中文字幕观看 | 亚洲综合在线五月 | 欧美 亚洲 另类 激情 另类 | 91精品久久久久久久99蜜桃 | 亚洲精品黄色在线观看 | 婷婷婷国产在线视频 | 久久精品爱爱视频 | 另类五月激情 | 国产成人免费av电影 | 久久久国产精品人人片99精片欧美一 | www.久久com| 成人不用播放器 | 国产精品成人一区二区三区吃奶 | 亚洲涩涩色 | 日本大尺码专区mv | 日韩午夜高清 | 色婷婷综合久色 | 国产日韩中文字幕在线 | 国产精品久久久久久久99 | 亚洲最新av | av成人免费网站 | 亚洲精品国产精品国自 | 中中文字幕av在线 | 国产精品国产亚洲精品看不卡 | 99免费视频| 亚洲精品视频久久 | 亚洲精品一区中文字幕乱码 | 国产精品99在线播放 | 久热免费| 狠狠躁夜夜av | 国产亚洲视频系列 | 色吊丝在线永久观看最新版本 | 国产拍在线 | 有码中文字幕在线观看 | 在线免费三级 | 一区二区久久久久 | 亚洲精品小视频在线观看 | 97狠狠操 | 国产视频精选在线 | 亚洲综合精品在线 | 久久最新视频 | 成人av免费在线 | 亚洲欧洲精品视频 | 香蕉色综合| 999ZYZ玖玖资源站永久 | 精品久久免费 | 中文字幕在线视频网站 | ,午夜性刺激免费看视频 | 国产精品久久久久婷婷 | 精品久久久久久久久久 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美在线观看视频 | 91成人在线观看高潮 | 黄污视频网站大全 | 国产精品久久久久久久av电影 | 日韩一区二区三区免费视频 | 天天艹天天 | 久色网 | 在线观看 亚洲 | 国产日韩在线播放 | 亚洲免费一级 | 五月天婷婷在线播放 | 国产精品 9999 | 人人射| 三日本三级少妇三级99 | 黄色毛片网站在线观看 | 亚洲精品资源在线 | 在线精品视频免费播放 | 91漂亮少妇露脸在线播放 | 中日韩免费视频 | 美女亚洲精品 | 久久久精品 一区二区三区 国产99视频在线观看 | www.婷婷色 | 国产精品自产拍 | 中文字幕精品三级久久久 | 国产黄色片免费观看 | 成人在线播放av | 午夜精品一二区 | 欧美久久久久久 | 亚洲日本va午夜在线电影 | 91高清免费观看 | 狠狠插天天干 | 免费合欢视频成人app | 亚洲人久久久 | 美女免费电影 | 人人爽人人爽人人片 | 9999精品 | 91成人在线观看高潮 | 久久99热久久99精品 | 国产精品尤物视频 | 国产精品99久久久久久久久久久久 | 操操操com | 狠狠色伊人亚洲综合成人 | 日韩高清不卡在线 | 久久99精品国产一区二区三区 | 国产成人一区三区 | 成人在线观看免费 | 国产成人免费高清 | 成人精品视频久久久久 | 久久精品视频网站 | 国产成人精品一区二区三区网站观看 | 成人亚洲欧美 | 黄色国产大片 | 亚洲女欲精品久久久久久久18 | 九九免费在线观看 | 久久久久亚洲精品成人网小说 | 亚洲综合小说 | 国产午夜在线观看视频 | 日韩综合视频在线观看 | 精品国产aⅴ麻豆 | 91丨九色丨91啦蝌蚪老版 | 人人草在线视频 | 亚洲区另类春色综合小说校园片 | 色婷婷狠狠五月综合天色拍 | 四虎在线影视 | 九九视频在线观看视频6 | 日韩中文字幕视频在线观看 | 在线视频一二区 | 日韩三级视频 | 三级黄色在线观看 | 激情婷婷| 国产专区欧美专区 | 日韩黄色中文字幕 | 日韩中文字幕免费视频 | 国产一级a毛片视频爆浆 | 国产91粉嫩白浆在线观看 | 在线观看免费版高清版 | 久久超碰免费 | 精品久久久久亚洲 | 亚洲婷婷综合色高清在线 | av高清不卡| 最新一区二区三区 | 色就干| 婷婷av在线| 黄色网址a| 中文字幕九九 | 中文字幕在线观看播放 | 黄色大片视频网站 | 亚洲精品在线观看av | 97精品一区| 91免费版在线观看 | 久久久亚洲精品 | 精品国产一区二区三区在线观看 | 九九在线精品视频 | 午夜精品电影 | 午夜精选视频 | 久久er99热精品一区二区三区 | 五月香婷 | 日韩精品久久久免费观看夜色 |