網(wǎng)絡(luò)通信
1.socket服務(wù)器
socket又叫套接字沧踏,實(shí)現(xiàn)網(wǎng)絡(luò)通信的兩端就是套接字潮改,分為服務(wù)器對(duì)應(yīng)的套接字和客戶(hù)端對(duì)應(yīng)的套接字
import socket
==========寫(xiě)一個(gè)服務(wù)器程序==========
a.創(chuàng)建服務(wù)器對(duì)應(yīng)的套接字對(duì)象(買(mǎi)了一個(gè)座機(jī))
socket(family, typr)
family:設(shè)置ip類(lèi)型 AF_INET(ipv4) -> 默認(rèn)值 AF_INET6(ipv6)
type:設(shè)置傳輸類(lèi)型 SOCK_STREAM(TCP可靠傳輸) SOCK_DGRAM(UDP不可靠傳輸)
server = socket.socket() #創(chuàng)建一個(gè)基于ipv4的可靠傳輸?shù)姆?wù)器套接字
b.綁定IP和端口(插電話(huà)線(xiàn)---確定電話(huà)號(hào)碼)
bind(ip擎鸠, 端口)
ip:服務(wù)器地址
端口:不同端口用來(lái)區(qū)分電腦上不用的服務(wù)宴树。取值范圍0~65535
注意:0~1024屬于著名端口(用來(lái)綁定特殊服務(wù)端口护糖,不要隨意用)
server.bind(('10.7.156.85', 5632))
c.監(jiān)聽(tīng)請(qǐng)求(交電話(huà)費(fèi))
listen(個(gè)數(shù))--需要通過(guò)數(shù)字設(shè)置服務(wù)器一次可以處理最大的請(qǐng)求個(gè)數(shù)
server.listen(512)
d.讓服務(wù)器一直處于啟動(dòng)狀態(tài)
while True:
# 5.接收客戶(hù)端的請(qǐng)求(有人撥電話(huà)了靴拱,接電話(huà))
"""
執(zhí)行到accept()垃喊,程序會(huì)停下來(lái),直到有客戶(hù)端在請(qǐng)求這個(gè)服務(wù)器的時(shí)候才會(huì)往下執(zhí)行袜炕。
返回會(huì)話(huà)和客戶(hù)端的地址
"""
conversation, addr = server.accept()
print(addr)
# 6.服務(wù)器給客戶(hù)端發(fā)送數(shù)據(jù)(說(shuō)話(huà))
"""
send(data)--> 發(fā)送數(shù)據(jù)
data:需要發(fā)送的數(shù)據(jù)本谜,要求是二進(jìn)制數(shù)據(jù)(bytes)
a.str 轉(zhuǎn) bytes
bytes(字符串, encoding='utf-8')
字符串.encode(編碼方式)
# message = '你好嗎偎窘?'
# # message_data = bytes(message, encoding='utf-8')
# message_data = message.encode( encoding='utf-8')
# conversation.send(message_data)
# 發(fā)送一張圖片
with open('./files/1.jgp', 'br')as f:
content = f.read()
conversation.send(content)
# 關(guān)閉鏈接
conversation.close()
# 7.接收客戶(hù)端發(fā)送的消息(聽(tīng)電話(huà))
"""
recv(字節(jié)數(shù))---> 接收從客戶(hù)端發(fā)送的數(shù)據(jù)乌助,參數(shù)是用來(lái)一次能接收的做大字節(jié)數(shù).
返回值是接收到的數(shù)據(jù)(二進(jìn)制)
bytes 轉(zhuǎn)換 字符串
str(二進(jìn)制,encoding='utf-8')
二進(jìn)制.decode(編碼方式)
注意:recv方法也會(huì)阻塞線(xiàn)路陌知,程序運(yùn)行到這人會(huì)等下等他托,等到對(duì)方發(fā)送消息為止
"""
# data = conversation.recv(1024)
# # re_meassage = str(data, encoding='utf-8')
# re_meassage = data.decode(encoding='utf-8')
# print(re_meassage)
"""
2.socket客戶(hù)端
import socket
a.創(chuàng)建客戶(hù)端套接字
client = socket.socket()
b.連接服務(wù)器
connect(地址)
client.connect(('10.7.156.85', 5536))
while True:
# 4.給服務(wù)器發(fā)送消息
message = input('客戶(hù)端:')
client.send(message.encode('utf-8'))
# 3.接收服務(wù)器返回的數(shù)據(jù)
re_data = client.recv(1024)
print('服務(wù)器:', re_data.decode('utf-8'))
if re_data.decode('utf-8') == '拜拜':
break
3.socket服務(wù)器升級(jí)
import socket
# 1.創(chuàng)建服務(wù)器套接字
sever = socket.socket()
# 2.綁定地址
sever.bind(('10.7.156.85', 5536))
# 3.監(jiān)聽(tīng)
sever.listen(100)
#讓服務(wù)器一直處于運(yùn)行狀態(tài)
while True:
# 4.接收請(qǐng)求
conversation, addr = server.accept()
# 保持通話(huà)
while True:
# 接收消息
message_re = conversation.recv(1024).decode('utf-8')
print('客戶(hù)端(%s):%s'%(addr[0][-2:], message_re))
if message_re == '拜拜':
break
# 發(fā)送消息
message = input('服務(wù)器:')
conversation.send(message.encode('utf-8'))
if message == '拜拜':
break
4.接收?qǐng)D片的客戶(hù)端
import socket
client = socket.socket()
client.connect(('10.7.156.97', 8081))
message_re = client.recv(1024)
data = bytes() # 創(chuàng)建一個(gè)空的二進(jìn)制數(shù)據(jù)
while message_re:
# print(message_re)
data += message_re # 將每次獲取到的數(shù)據(jù)疊加
print('接收到數(shù)據(jù)')
message_re = client.recv(1024)
with open('./new.jpg', 'bw') as f:
f.write(data)
print('接受完成')
5.repuests請(qǐng)求
import requests
"""
requests.get(url, params)
url: 請(qǐng)求地址
params:客戶(hù)端給服務(wù)器發(fā)送的數(shù)據(jù)(字典){參數(shù)名:值}
"""
# https://www.apiopen.top/satinApi?type=1&page=1
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
response = requests.get(url, {'type': 1, 'page': 1})
# 1.獲取響應(yīng)頭
print(response.headers)
# 2.拿二進(jìn)制形式的響應(yīng)體
data_bytes = response.content
print(type(data_bytes))
# 3.拿字符串形式的響應(yīng)體
data_text = response.text
print(data_text, type(data_text))
# 4.拿json格式對(duì)應(yīng)的python數(shù)據(jù)
data_json = response.json()
print(data_bytes)
# 下載圖片到本地
response = requests.get('')
content = response.content
with open('./aa.jpg', 'wb')as f:
f.write(content)