網(wǎng)絡(luò)編程
1.socket
socket又叫套接字巧涧,指的是網(wǎng)絡(luò)通信的兩端酪刀,分別是服務(wù)器和客戶端
socket編程指的就是通過代碼實現(xiàn)客戶端和服務(wù)器之間的通信
2.服務(wù)器的實現(xiàn)
2.1創(chuàng)建套接字對象
server = socket.socket()
參數(shù)說明:
family:ip類型笤受,AF_INET -> IPv4歉眷,AF_INET6 -> IPv6
type:傳輸協(xié)議類型,SOCK_STREAM ->TCP,SOCK_DGRAM ->UDP
2.2綁定IP地址和端口
bind((ip地址,端口號))
ip用來區(qū)分互聯(lián)網(wǎng)上設(shè)備
端口是用來區(qū)分一臺計算機上的不同服務(wù)(應(yīng)用),端口范圍是0-65535辉阶,其中0-1024是著名端口,選擇端口時用其他端口
server.bind(('10.7.190.164',8080))
2.3啟動服務(wù)器(監(jiān)聽請求)
listen(數(shù)量) --數(shù)量指的是一次性能夠處理的最大請求數(shù)
server.listen(255)
2.4讓服務(wù)器一直處于運行狀態(tài)
while True:
print('開始監(jiān)聽...')
connect,addr = server.accept() #等待客戶端的請求瘩扼,程序運行到這里會停下(類似input)睛藻,等到有客戶端來連接服務(wù)器,才會接著往后執(zhí)行
print(connect,addr)
#send(數(shù)據(jù)) --發(fā)送數(shù)據(jù)邢隧,數(shù)據(jù)是二進制數(shù)據(jù)
message = input('>>>')
connect.send(message.encode(encoding='utf-8'))
#recv(字節(jié)數(shù)) --接收數(shù)據(jù),并且指定一次性接收的數(shù)據(jù)的大小的最大值冈在;返回接收到的二進制數(shù)據(jù)倒慧,程序運行到這里也會停下,直到客戶端給服務(wù)器發(fā)送消息后才會接著往后執(zhí)行包券。
data = connect.recv(1024)
print('<<<')
print(data.decode(encoding='utf-8'))
connect.close()
3.客戶端的實現(xiàn)
3.1創(chuàng)建套接字對象
client = socket.socket()
3.2連接服務(wù)器
connect((ip地址纫谅,端口))
client.connect(('10.7.190.164',8080)) #要連接的服務(wù)器ip和端口,客戶端發(fā)送消息端口是隨機的,但可以指定溅固。
3.3接收消息
data = client.recv(1024)
print('<<<<')
print(data.decode(encoding='utf-8'))
3.4發(fā)送消息
message = input('>>>')
client.send(message.encode(encoding='utf-8'))
client.close()
4.網(wǎng)絡(luò)請求
根據(jù)網(wǎng)絡(luò)接口請求數(shù)據(jù):通過第三方庫requests提供的方法
import requests
response = requests.get('網(wǎng)絡(luò)地址')
response.text #獲取字符串形式的數(shù)據(jù)結(jié)果
response.content #獲取二進制數(shù)據(jù)
response.json() #函數(shù)付秕,獲取json數(shù)據(jù)并轉(zhuǎn)換為對應(yīng)的python數(shù)據(jù)類型
多線程
1.什么是進程
一個正在運行的應(yīng)用程序就是一個進程,系統(tǒng)會給每個進程分配一個獨立的內(nèi)存區(qū)域侍郭,用來保存程序運行過程中產(chǎn)生的數(shù)據(jù)询吴,當(dāng)進程結(jié)束的時候,這個內(nèi)存區(qū)域會自動銷毀亮元。
2.什么是線程
進程想要執(zhí)行任務(wù)就必須要有線程猛计。每個進程都默認(rèn)有一個線程,這個線程叫主線程爆捞,其他的線程叫子線程奉瘤。程序任務(wù)都是默認(rèn)在主線程中執(zhí)行的。
一個線程中執(zhí)行多個任務(wù)煮甥,任務(wù)是串行執(zhí)行的(一個一個按順序執(zhí)行)
一個進程中如果有多個線程盗温,多線程執(zhí)行不同任務(wù)的時候是并行(同時執(zhí)行藕赞,實質(zhì)是假象,是cpu在不同線程間來回調(diào)度)
3.python中怎么使用多線程
python通過內(nèi)置的threading模塊來提供多線程相關(guān)技術(shù)卖局;
其中有一個Thread類斧蜕,這個類的對象就是線程對象。
def download(film):
print('開始下載: %s time: %s' % (film, str(datetime.now())))
sleep(15)
print('%s下載完成 time:%s' % (film, str(datetime.now())))
print(threading.current_thread())
# 在主線程中下載兩個電影: 一個一個的下載吼驶,一個下載完才下載另一個惩激,總耗時兩個電影耗時之和
# download('戀戀筆記本')
# download('摔跤吧爸爸')
# 1.直接創(chuàng)建線程類的對象
"""
a.語法:
線程對象 = Thread(target=函數(shù), args=參數(shù)) - 創(chuàng)建一個線程對象,并且返回蟹演。
b.說明
函數(shù) - function類型的變量; 這個函數(shù)的函數(shù)體就會在子線程中執(zhí)行
參數(shù) - 元祖; 參數(shù)會傳給target對應(yīng)的函數(shù)
"""
t1 = threading.Thread(target=download, args=('大國崛起',))
t2 = threading.Thread(target=download, args=('霸王別姬',))
# 2.讓線程開始執(zhí)行任務(wù)
"""
線程對象.start() - 開始執(zhí)行子線程中的任務(wù)
"""
t1.start()
t2.start()
download('變形金剛')
print('=======')
# 某個線程出現(xiàn)異常风钻,是線程直接結(jié)束;進程不一定結(jié)束酒请,所有的線程都結(jié)束骡技,進程才會結(jié)束
print([1, 2][10])
print('+++++++++++')
3.1直接創(chuàng)建線程類對象
語法:
import threading
線程對象 = threading.Thread(target=函數(shù),args=參數(shù)) -創(chuàng)建一個線程對象,并返回
說明:
函數(shù) -function類型的變量羞反,這個函數(shù)的函數(shù)體就會在子線程中執(zhí)行
參數(shù) -元祖布朦,參數(shù)會傳給target對應(yīng)的函數(shù)
讓線程開始執(zhí)行任務(wù):
線程對象.start() --開始執(zhí)行子線程中的任務(wù)
當(dāng)某個線程出現(xiàn)異常,是線程直接結(jié)束昼窗,進程不一定結(jié)束是趴,只有所有的線程都結(jié)束,進程才結(jié)束
threading.current_thread()
3.2創(chuàng)建線程子類
- 聲明一個類繼承threading模塊的Thread類
- 重寫run()方法澄惊,這個方法中的任務(wù)就是需要在子線程中執(zhí)行的任務(wù)
- 創(chuàng)建當(dāng)前類的對象唆途,就是線程對象
- 啟動線程(還是通過start()調(diào)用)
from threading import Thread,current_thread
class DownLoadThread(Thread):
def __init__(self,film):
super().__init__()
self.film = film
def run(self):
print('下載電影:%s %s',% (self.film,current_thread()))
t1 = DownLoadThread()
t1.start() #線程對象調(diào)用start會自動在子線程中去調(diào)用run方法
#t1.run() 這個也可以,但是是在主線程中執(zhí)行因此沒有意義
3.3 join的用法
線程對象.join() --程序執(zhí)行到這個地方會停下來(線程阻塞)掸驱,直到線程對象中的任務(wù)執(zhí)行完成后才繼續(xù)執(zhí)行后面的語句