網(wǎng)絡(luò)編程
socket
什么是socket編程
socket又叫套接字溯壶,指的是實現(xiàn)通信的兩個端;這兩個端又分為服務(wù)端套接字和客服端套接字
服務(wù)器套接字
python中提供了一個socket模塊來支持socket編程
# 1) 創(chuàng)建套接字對象(買電話機(jī))
socket(family=AF_INET, type=SOCK_STREAM)
family - 設(shè)置ip類型; AF_INET - ipv4, AF_INET6 - ipv6
type - 設(shè)置數(shù)據(jù)的傳輸方式; SOCK_STREAM - TCP, SOCK_DGRAM - UDP
server = socket.socket()
# 2) 綁定ip和端口(插電話線)
"""
bind((ip地址, 端口號))
ip地址 - 字符串; 服務(wù)器程序運行在哪臺計算機(jī)上,ip地址就寫哪臺計算機(jī)的ip
端口號 - 整型;范圍是0~65535茸塞,其中0~1024是著名端口躲庄,有自己特殊的意義一般不隨便用查剖。
"""
server.bind(('10.7.181.109', 8882))
# 3) 等待連接并且設(shè)置同一時間能夠接收的請求數(shù)量
server.listen(512)
# 4) 讓服務(wù)器保持一致運行的狀態(tài)
while True:
print('開始監(jiān)聽')
# 5) 接收請求(接電話)
# 注意: 當(dāng)程序執(zhí)行到accept()的時候钾虐,會停下來直到有客戶端給當(dāng)前服務(wù)器發(fā)送請求為止
connect, address = server.accept()
print('接收到請求')
print(connect, address)
# 保持通話
while True:
# 6) 接收客戶端發(fā)送的數(shù)據(jù)(聽別人講電話)
"""
recv(數(shù)據(jù)大小) - 接收數(shù)據(jù)并且設(shè)置一次性能夠接收最大數(shù)據(jù)
補充: 二進(jìn)制轉(zhuǎn)字符串
二進(jìn)制對象.decode(encoding='utf-8')
str(二進(jìn)制對象, encoding='utf-8')
"""
recv_data = connect.recv(1024)
# print('接收:', recv_data.decode(encoding='utf-8'))
print('接收:', str(recv_data, encoding='utf-8'))
# 7) 給客戶端發(fā)送數(shù)據(jù)(說話別人聽)
"""
send(數(shù)據(jù)) - 發(fā)送數(shù)據(jù),數(shù)據(jù)的類型必須是bytes
"""
# 發(fā)送一個網(wǎng)頁數(shù)據(jù)
# with open('test.html', encoding='utf-8') as f:
# # html = f.read()
# # message = 'HTTP/1.1 200 OK\r\n\r\n'+html
# # connect.send(message.encode())
send_message = input('服務(wù)器:')
connect.send(send_message.encode())
# 8) 關(guān)閉連接(掛電話)
connect.close()
客戶端套接字
import socket
# 1.創(chuàng)建套接字對象(買電話機(jī))
client = socket.socket()
# 2.發(fā)送請求(打電話)
"""
connect((ip地址, 端口號))
"""
client.connect(('10.7.181.109', 8882))
while True:
# 3.發(fā)送消息
send_message = input('客戶端:')
client.send(send_message.encode())
# 4.接收消息
re_data = client.recv(1024)
print(re_data.decode(encoding='utf-8'))
client.close()
圖片socket
from socket import *
server = socket()
server.bind(('10.7.181.109', 12346))
server.listen(512)
# 讓程序一直運行
while True:
print('開始監(jiān)聽....')
connect, address = server.accept()
print(address)
# 發(fā)送圖片
with open('files/luffy.jpg', 'rb') as f:
connect.send(f.read())
connect.close()
圖片client
from socket import *
client = socket()
client.connect(('10.7.181.109', 12347))
# 圖片輸入較大數(shù)據(jù)笋庄,在TCP傳輸協(xié)議中會分段發(fā)送
while True:
re_data = client.recv(1024)
with open('files/new.jpg', 'ab') as f:
f.write(re_data)
if(len(re_data) < 1024):
break