網(wǎng)絡(luò)基礎(chǔ)
OSI模型
協(xié)議
數(shù)據(jù)解封
數(shù)據(jù)封裝
TCP與UDP協(xié)議
URL資源定位符
01-socket編程
import socket
- socket又叫套接字,就是進(jìn)行數(shù)據(jù)通信兩端得运。分為服務(wù)端套接字和客戶端套接字
套接字編程:自己寫服務(wù)器或者客戶端,進(jìn)行數(shù)據(jù)傳輸
Python對socket編程的支持:提供一個socket的庫(內(nèi)置)
def creat_server():
'''寫一個服務(wù)器'''
1.創(chuàng)建套接字對象
'''
socket(family,type)
a.family: 確定IP協(xié)議類型
AF_INET: ipv4
AF_INET6: ipv6
b.type: 傳輸協(xié)議類型
SOCK_STREAM: TCP協(xié)議
SOCK_DGRAM: UDP協(xié)議
'''
server = socket.socket()
2.綁定IP地址和端口
'''
bind((ip地址乙漓,端口))
端口:一臺電腦上一個端口標(biāo)記一個唯一的服務(wù)。
范圍0-65535,0-1024是著名端口释移,專門用來標(biāo)記一些特殊的服務(wù)叭披,一般不用
但是,同一個端口同一時間只能綁定一個服務(wù)
'''
server.bind(('10.7.153.190', 2000))
3.開始監(jiān)聽(監(jiān)聽客戶端的請求)
'''
listen(最大監(jiān)聽個數(shù))
同一時間能夠連接的客戶端的個數(shù)
'''
server.listen(10)
connect, addr = server.accept()
4.讓服務(wù)器處于運(yùn)行狀態(tài)
while True:
print('================')
5.連接客戶端(建立連接),返回連接對象和客戶端地址
這句代碼會阻塞線程玩讳。直到有客戶端來請求當(dāng)前服務(wù)器為止
print('監(jiān)聽狀態(tài)')
print(addr)
print('================')
6.服務(wù)器給客戶端發(fā)送消息
'''
send(data)
data:python3中要求類型是bytes涩蜘,Python2可以是字符串
1.字符串(str)轉(zhuǎn)換成二進(jìn)制(bytes)
字符串.encode(編碼方式) ----》 編碼方式默認(rèn)值是'utf-8'
bytes(字符串,編碼方式)
'''
message = input('客戶端:')
connect.send(message.encode())
connect.send(bytes(message,'utf-8'))
if message == '拜拜':
server.listen(10)
connect, addr = server.accept()
continue
print('=================')
7.接收從客戶端發(fā)送過來的消息
注意:recv方法也會阻塞線程
'''
recv(bufsize)
bufsize:每次能夠接收的最大的字節(jié)數(shù)
返回值:接收的數(shù)據(jù)熏纯,類型是bytes
2.二進(jìn)制轉(zhuǎn)換字符串:
二進(jìn)制.decode()
str(二進(jìn)制同诫,編碼方式)
'''
recv_datd = connect.recv(1024)
print(recv_datd.decode())
# print(str(recv_datd,'utf-8'))
8.斷開連接
connect.close()
02-客戶端
import socket
def creat_client():
1.創(chuàng)建套接字對象
client = socket.socket()
2.連接服務(wù)器
'''
connect(服務(wù)器地址)
'''
client.connect(('10.7.153.190', 2000))
while True:
3.接收服務(wù)器發(fā)送的消息
data = client.recv(1024)
print(data.decode(encoding='utf-8'))
print('================')
4.給服務(wù)器發(fā)送消息
message = input('服務(wù)器:')
client.send(message.encode())
if message == '拜拜':
break
print('================')
5.斷開連接
client.close()
if __name__ == '__main__':
creat_client()
03-圖片服務(wù)器
import socket
if __name__ == '__main__':
1.創(chuàng)建套接字()
server = socket.socket()
2.綁定地址(插電話線,綁定電話號碼)
server.bind(('10.7.153.190', 2000))
3.監(jiān)聽(人坐在電話旁)
server.listen(512)
# 保證電話被打通
while True:
4.接收請求(接電話)
connect,addr = server.accept()
print(addr)
5.發(fā)送數(shù)據(jù)(講電話)
with open('./files/ksnm.jpg','br') as f:
data = f.read()
connect.send(data)
6.接收數(shù)據(jù)(聽對方講話)
# connect.recv(1024)
7.關(guān)閉連接(掛電話)
connect.close()
04-圖片客戶端
import socket
if __name__ == '__main__':
client = socket.socket()
client.connect(('10.7.153.190', 2000))
創(chuàng)建一個空的二進(jìn)制數(shù)據(jù)
all_data = bytes()
接收從服務(wù)器傳回來的數(shù)據(jù)
data = client.recv(1024)
while data:
print('接收到數(shù)據(jù)')
all_data += data
data = client.recv(1024)
with open('./files/new.jpg','wb') as f:
f.write(all_data)
# print(all_data)
client.close()
05-http請求
import requests
if __name__ == '__main__':
1.準(zhǔn)備url()
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
2.發(fā)送請求
'''
get(url,參數(shù)對應(yīng)的字典)
post(url,參數(shù)對應(yīng)的字典)
返回值是服務(wù)器返回的響應(yīng)
'''
response = requests.get(url)
# requests.get('https://www.apiopen.top/satinApi',{'type':1,'page':1})
print(response)
3.通過響應(yīng)獲取服務(wù)器返回的數(shù)據(jù)
a.獲取字符串類型的數(shù)據(jù)
print(response.text)
b.獲取json格式的數(shù)據(jù)
print(response.json())
print(response.json()['msg'])
c.獲取二進(jìn)制格式的數(shù)據(jù)
print(response.content)
4.獲取響應(yīng)頭(了解)
print(response.headers)
![QQ截圖20180912091833.png](https://upload-images.jianshu.io/upload_images/13692239-087f21275d20c02a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)