01 - 套接字server
1.什么是socket編程
socket又叫套接字酵颁,值得是實現通信的兩個端嫉你;這個兩個端又分為服務器套接字和客戶端套接字
2.服務器套接字
python中提供了一個socket模塊來支持socket編程
1)創(chuàng)建套接字對象
family - 設置ip類型;AF_INET - ipv4,AF_INET6 - ipv6
type - 設置數據的傳輸方式躏惋;SOCK_STREAM - TCP, SOCK_DGRAM - UDP
from socker import *
socket(family=AF_INET, type=SOCK_STREAM)
server = socket.socket()
2)綁定ip和端口
bind((ip地址幽污,端口號))
ip地址 - 字符串;服務器程序運行在哪臺計算機上簿姨,ip地址就寫哪臺計算機的ip
端口號 - 整形距误;范圍065535,其中01024是著名端口,有自己特殊意義一般不隨便用扁位。
erver.bin(("xxx.xxx.xxx.xxx",8888))
3)等待連接并且設置同一時間能夠接受的請求數量
server.listen(500)'
4)讓服務器保持一致運行的狀態(tài)
while True:
print("開始監(jiān)聽")
5)接受請求(接電話)
注意:當程序執(zhí)行到accept()的時候准潭,會停下來直到有客戶端給當前服務器發(fā)送請求為止
coonnect, address = server.accept()
print("接收到請求")
print("connect, address")
保持通話
while True:
6)接收客戶端發(fā)送的數據(聽別人講電話)
recv(數據大小) - 接收數據并且設置一次性能夠接收最大數據
補充: 二進制轉字符串
二進制對象.decode(encoding='utf-8')
str(二進制對象, encoding='utf-8')
recv_data = connect.recv(1024)
print('接收:', recv_data.decode(encoding='utf-8'))
print('接收:', str(recv_data, encoding='utf-8'))
7)給客戶端發(fā)送數據(說話別人聽)
send(數據) - 發(fā)送數據,數據的類型必須是bytes
發(fā)送一個網頁數據
with open('test.html', encoding='utf-8') as f:
html = f.read()
me ssage = 'HTTP/1.1 200 OK\r\n\r\n'+html
connect.send(message.encode())
send_message = input('服務器:')
connect.send(send_message.encode())
8)關閉連接(掛電話)
connect.close()
02 - 套接字client
import socket
1.創(chuàng)建套接字對象(買電話機)
client = socket.socket()
2.發(fā)送請求(打電話)
connect((ip地址, 端口號))
client.connect(('10.7.181.129', 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()
03 - 圖片server
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()
04 - 圖片client
from socket import *
client = socket()
client.connect(('10.7.181.109', 12347))
圖片輸入較大數據域仇,在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