1.
"""
socket編程(套接字): 指的就是通過代碼來創(chuàng)建實(shí)現(xiàn)通信的兩個(gè)端(服務(wù)器和客戶端)
socket一般可以基于TCP和UDP實(shí)現(xiàn)客戶端和服務(wù)器之間的可靠傳輸和不可靠傳輸
python中的內(nèi)置模塊socket可以支持socket編程
"""
import socket
# 通過socket實(shí)現(xiàn)服務(wù)器端
if __name__ == '__main__':
# 1. 創(chuàng)建服務(wù)器套接字對(duì)象
"""
family:確定服務(wù)類型
AF_INET --> ipv4
AF_INET6 --> ipv6
type:確定傳輸協(xié)議類型
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)是用來區(qū)分一個(gè)計(jì)算機(jī)中不同的服務(wù),范圍是0-65535罐孝;
注意:1.其中0-1024是'著名端口'用來綁定一些特殊的服務(wù)的暴区,一般不使用旦万。
2.同一時(shí)間一個(gè)端口只能綁定一個(gè)服務(wù)
"""
server.bind(('10.7.181.117', 8081))
# 3. 監(jiān)聽
"""
參數(shù):用來限制一次性能夠接受的客服端請(qǐng)求數(shù)量
"""
server.listen(50)
print('開始監(jiān)聽請(qǐng)求')
# 保證服務(wù)器處于一直啟動(dòng)的狀態(tài)
while True:
# 4. 接收客戶端的請(qǐng)求
"""
accept()會(huì)阻塞線程,當(dāng)有客戶端給這個(gè)服務(wù)器發(fā)送請(qǐng)求,才會(huì)開始執(zhí)行
"""
client, addr = server.accept()
print(addr)
# 5.給客戶端發(fā)送消息
"""
send(數(shù)據(jù)):數(shù)據(jù)必須是二進(jìn)制數(shù)據(jù)(bytes)類型
字符串轉(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())
# 接收從客戶端發(fā)來的消息
"""
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()
2.
import socket
if __name__ == '__main__':
# 1.創(chuàng)建套接字對(duì)象
client = socket.socket()
# 2.連接服務(wù)器
client.connect(('10.7.181.117', 8081))
# 3.接收信息
data = client.recv(1024)
print('接收到服務(wù)器的數(shù)據(jù):', data.decode(encoding='utf-8'))
# 4.發(fā)送信息
str1 = input('>>>')
client.send(str1.encode(encoding='utf-8'))
client.close()
3.
import socket
if __name__ == '__main__':
# 1.創(chuàng)建對(duì)象
server = socket.socket()
# 2.綁定地址
server.bind(('10.7.181.117', 12345))
# 3.監(jiān)聽
server.listen(50)
# 保持服務(wù)器不關(guān)閉
while True:
conversation, addr = server.accept()
print(addr)
# 讓客戶端和服務(wù)器一直處于連接的狀態(tài)
while True:
# 發(fā)送消息
message = input('>>>')
conversation.send(message.encode())
# 接收消息
message_data = conversation.recv(1024)
print(message_data.decode(encoding='utf-8'))
4.
import socket
if __name__ == '__main__':
# 1.創(chuàng)建套接字對(duì)象
client = socket.socket()
# 2.連接服務(wù)器
client.connect(('10.7.181.117', 12345))
while True:
# 接收消息
data = client.recv(1024)
print(data.decode(encoding='utf-8'))
# 發(fā)送消息
message = input('>>>')
client.send(message.encode())
5.
import socket
if __name__ == '__main__':
server = socket.socket()
server.bind(('10.7.181.117', 8081))
server.listen(10)
while True:
conversation, addr = server.accept()
print(addr)
# 發(fā)送一張圖片
with open('./luffy2.png', 'rb') as f:
data = f.read()
conversation.send(data)
conversation.close()
6.
import socket
if __name__ == '__main__':
client = socket.socket()
client.connect(('10.7.181.117', 8081))
# 接收數(shù)據(jù)印叁,因?yàn)閳D片數(shù)據(jù)較大,可能會(huì)分多次發(fā)送
image_data = bytes() # 創(chuàng)建一個(gè)空的bytes用來保存整個(gè)圖片數(shù)據(jù)
data = client.recv(1024)
while data:
image_data += data
data = client.recv(1024)
# 保存圖片到本地
with open('./image.png', 'wb') as f:
f.write(image_data)
client.close()
7.
"""
服務(wù)器:(python)\java\php等等
HTTP(為了可以讓客戶端和服務(wù)器能夠進(jìn)行有效的數(shù)據(jù)交流)
客戶端:網(wǎng)頁(yè)(js)榨汤、iOS設(shè)備上的軟件(OC/Swift)蠕搜、安卓設(shè)備上的軟件(java)
"""
"""
python中訪問網(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ù)用&隔開
# 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)