立即學習:https://edu.csdn.net/course/play/24458/296234?utm_source=blogtoedu
1.服務器端
#以打電話通訊為例子進行說明
#導入相應的模塊
import socket#1、設置套接字的類型以及協議(買手機),其實就是設置一個套接字,phone即為一個套接字
#設置為網絡類型的套接字:socket.AF_INET
#設置為TCP協議:socket.SOCK_STREAM
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#2、綁定端口以及制定IP地址(綁定手機卡)
#bind(('ip地址',端口))傳入的是一個元組
#端口是0-65550,其中0-1024是給操作系統使用的
phone.bind(('127.0.0.1',8080))#3、監聽端口listen()
#表示可掛起的請求的最大數量為5個,如接著一個電話時,另一個電話又打進了,這時候需要將這個電話掛起,等當前的電話結束后再處理后面打進來的這個電話
phone.listen(5)#4、阻塞,等待客戶端的連接accept()
res = phone.accept()'''(<socket.socket fd=348, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 65470)>, ('127.0.0.1', 65470))res返回了一個元組,含有兩個元素,第一個元素是套接字對象:<socket.socket fd=348, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 65470)>,第二個是本地地址與端口組成的元素('127.0.0.1', 65470)'''#5、獲得收發消息的套接字
conn,client_addr = res#6、收發消息#1)接收客戶端的請求信息recv()
data = conn.recv(1024)#1024表示接收的字節最大量是1024bytes
print('這是客戶端的請求數據',data)#2)處理接收的請求后,發送數據send()
#將客戶端發送來的小寫字母經過大寫處理后發送返回給客戶端
conn.send(data.upper())#7、關閉接收消息的套接字
conn.close()#8、關閉phone套接字
phone.close()
?
2.客戶端
#導入模塊
import socket#1、設置phone套接字
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#2、連接服務器(打電話),本地地址:127.0.0.1
phone.connect(('127.0.0.1',8080))#3、向服務器發送請求send(),發送的數據不能直接發送字符串,因為要傳送到物理層底層,因此需要轉換成二進制的bytes類型進行發送,只需:發送的數據.encode('utf-8')即可
phone.send('hello'.encode('utf-8'))#4、接收服務器返回來的數據recv()
res = phone.recv(1024)#接收小于1024bytes的數據
print('服務器返回來的數據:',res)#5、關閉套接字phone
phone.close()
?
注:服務器端含有兩個套接字,一個是phone用于綁定、監聽端口,等待客戶端請求,conn用于接收發送數據;而客戶端則是只有一個套接字,phone,用于與服務器端進行通訊
?