socket又叫套接字能扒,指的就是實現(xiàn)通信過程的兩個端跪帝,等待請求的一端叫服務器套接字您访,
發(fā)送請求的一端叫客戶套接字
python中提供了socket模塊來支持socket編程
import socket
========服務器套接字=======
1.創(chuàng)建套接字對象
socket(family,type)
family - 設(shè)置ip類型 AF_INET -ipv4
type - 設(shè)置傳輸類型 SOCK_STREAM -tcp
創(chuàng)建一個套接字對象咙边,基于ipv4和tcp的套接字對象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2.綁定ip地址和端口
bind(ip地址,端口號)
ip地址 - 服務器對應的計算機的ip地址审编,字符串
端口號 - 用來區(qū)分計算機上不同的服務撼班;是一個數(shù)字,范圍是0-65535垒酬,但是其中
1024以下的是著名端口砰嘁,用來表示一些特殊的服務,一般不使用
同一時間一個端口只能對應一個服務
server.bind(('10.7.187.58', 8081))
3.開始監(jiān)聽
listen(最大監(jiān)聽數(shù))
最大監(jiān)聽數(shù) - 用來設(shè)置當服務一次可以處理對少個請求
server.listen(100)
print('開始監(jiān)聽')
4.讓服務器一直處于啟動狀態(tài)
while True:
5.接收客戶端發(fā)送的請求,返回建立的會話和客戶端地址勘究;注意:這段代碼會阻塞線程
#程序運行到這兒會停下來矮湘,直到有客戶端給當前服務器發(fā)送請求為止
convertion, addr = server.accept()
#####6.接收消息(客戶端發(fā)送給服務器的消息)
recv(緩存大小) - 獲取客戶端給服務器發(fā)送的數(shù)據(jù),返回的是二進制
緩存大小 - 決定一次可以接收的數(shù)據(jù)的最大字節(jié)數(shù)
這兒也會阻塞線程口糕,直到客戶端發(fā)送了消息才會接著往后執(zhí)行
re_data = convertion.recv(1024)
print(re_data.decode('utf-8'))
7.發(fā)送數(shù)據(jù)(服務器給客戶端發(fā)送數(shù)據(jù))
send(數(shù)據(jù)) - 將指定的數(shù)據(jù)發(fā)送給客戶端
數(shù)據(jù) - 要求是二進制
字符串(str)轉(zhuǎn)二進制(bytes):
bytes(字符串, 'utf-8')
字符串.encode('utf-8')
二進制轉(zhuǎn)字符串
a.str(二進制數(shù)據(jù)缅阳,'utf-8')
b.二進制.decode('utf-8')
'''
# message = 'HTTP/1.1 200 OK\r\n\r\n <html><head><meta charset="utf-8"></head><body>你好</body></html>!'
# convertion.send(bytes(message, encoding='utf-8'))
message = input('>>')
while True:
if message:
convertion.send(message.encode(encoding='utf-8'))
message = input('>>')
else:
break
###8.關(guān)閉連接
convertion.close()
####客戶端套接字
import socket
####1.創(chuàng)建套接字對象
client = socket.socket()
####2.請求連接服務器
connect((ip,端口))
client.connect(('10.7.187.58', 8081))
####3.發(fā)送消息
message = input('>>')
while True:
if message:
client.send(message.encode('utf-8'))
# 4.接收消息
re_data = client.recv(1024)
print(re_data.decode('utf-8'))
message = input('>>')
else:
break