服務(wù)端
- socket編程(套接字): 指的就是通過(guò)代碼來(lái)創(chuàng)建實(shí)現(xiàn)通信的兩個(gè)端(服務(wù)器和客戶(hù)端)
socket一般可以基于TCP和UDP實(shí)現(xiàn)客戶(hù)端和服務(wù)器之間的可靠傳輸和不可靠傳輸
python中的內(nèi)置模塊socket可以支持socket編程
import socket
# 通過(guò)socket實(shí)現(xiàn)服務(wù)器端
if __name__ == '__main__':
# 1. 創(chuàng)建服務(wù)器套接字對(duì)象
"""
family:確定服務(wù)類(lèi)型
AF_INET --> ipv4
AF_INET6 --> ipv6
type:確定傳輸協(xié)議類(lèi)型
SOCK_STREAM -> TCP協(xié)議
SOCK_DGRAM -> UDP協(xié)議
"""
# server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
server = socket.socket()
# 2. 綁定ip地址和端口
"""
地址格式:(ip地址字符串, 端口號(hào))
端口號(hào)是用來(lái)區(qū)分一個(gè)計(jì)算機(jī)中不同的服務(wù),范圍是0-65535叼旋;
注意:1.其中0-1024是'著名端口'用來(lái)綁定一些特殊的服務(wù)的直奋,一般不使用。
2.同一時(shí)間一個(gè)端口只能綁定一個(gè)服務(wù)
"""
server.bind(('10.7.181.117', 8081))
# 3. 監(jiān)聽(tīng)
"""
參數(shù):用來(lái)限制一次性能夠接受的客服端請(qǐng)求數(shù)量
"""
server.listen(50)
print('開(kāi)始監(jiān)聽(tīng)請(qǐng)求')
# 保證服務(wù)器處于一直啟動(dòng)的狀態(tài)
while True:
# 4. 接收客戶(hù)端的請(qǐng)求
"""
accept()會(huì)阻塞線(xiàn)程犹赖,當(dāng)有客戶(hù)端給這個(gè)服務(wù)器發(fā)送請(qǐng)求度苔,才會(huì)開(kāi)始執(zhí)行
"""
client, addr = server.accept()
print(addr)
# 5.給客戶(hù)端發(fā)送消息
"""
send(數(shù)據(jù)):數(shù)據(jù)必須是二進(jìn)制數(shù)據(jù)(bytes)類(lèi)型
字符串轉(zhuǎn)二進(jìn)制:
bytes(字符串,encoding=編碼方式)
字符串.encode(encoding=編碼方式)
"""
client.send('HTTP/1.1 200 OK\r\n\r\n'.encode(encoding='utf-8'))
client.send(bytes('hello', encoding='utf-8'))
client.send('python'.encode())
# 接收從客戶(hù)端發(fā)來(lái)的消息
"""
bufsize:設(shè)置緩存大幸艚搿(單位是字節(jié))
1024字節(jié) -> 1k
1024k -> 1M
1024M -> 1G
1024G -> 1T
1024T - 1P
二進(jìn)制(bytes)轉(zhuǎn)換字符串:
a. str(二進(jìn)制數(shù)據(jù), encoding='utf-8')
b. 二進(jìn)制數(shù)據(jù).decode(encoding='utf-8')
"""
# data = client.recv(1024)
# str1 = str(data, encoding='utf-8')
# str2 = data.decode(encoding='utf-8')
# print(str1)
# 6.關(guān)閉連接
client.close()
客戶(hù)端
import socket
if __name__ == '__main__':
# 1.創(chuàng)建對(duì)象
server = socket.socket()
# 2.綁定地址
server.bind(('10.7.181.117', 12345))
# 3.監(jiān)聽(tīng)
server.listen(50)
# 保持服務(wù)器不關(guān)閉
while True:
conversation, addr = server.accept()
print(addr)
# 讓客戶(hù)端和服務(wù)器一直處于連接的狀態(tài)
while True:
# 發(fā)送消息
message = input('>>>')
conversation.send(message.encode())
# 接收消息
message_data = conversation.recv(1024)
print(message_data.decode(encoding='utf-8'))
http協(xié)議
- 服務(wù)器:(python)\java\php等等
- HTTP(為了可以讓客戶(hù)端和服務(wù)器能夠進(jìn)行有效的數(shù)據(jù)交流)
- 客戶(hù)端:網(wǎng)頁(yè)(js)攻泼、iOS設(shè)備上的軟件(OC/Swift)竣付、安卓設(shè)備上的軟件(java)
- python中訪(fǎng)問(wèn)網(wǎng)絡(luò)中的數(shù)據(jù):第三方庫(kù)requests
from requests import request
if __name__ == '__main__':
# https: // www.apiopen.top / satinApi?type = 1 & page = 1
# GET請(qǐng)求:參數(shù)以诡延?號(hào)的形式拼接到url地址后面,參數(shù)名=值的形式卑笨,多個(gè)參數(shù)用&隔開(kāi)
# 1.確定url
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
# 2.發(fā)送請(qǐng)求
"""
request(請(qǐng)求方式,請(qǐng)求地址)
返回值:響應(yīng)
"""
response = request('GET', url)
print(type(response), response)
# 1.以字符串的形式獲取響應(yīng)體(服務(wù)器返回的數(shù)據(jù))
text = response.text
print(type(text), text)
# 2.以json的形式獲取響應(yīng)體
json = response.json()
print(type(json),json)
# 3.以二進(jìn)制的形式獲取響應(yīng)體
content = response.content
print(type(content), content)