立即學習:https://edu.csdn.net/course/play/24458/296235?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()
while True:data = conn.recv(1024)#1024表示接收的字節最大量是1024bytesprint('這是客戶端的請求數據',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')即可
while True:msg = input("請輸入:")phone.send(msg.encode('utf-8'))#4、接收服務器返回來的數據recv()res = phone.recv(1024)#接收小于1024bytes的數據print('服務器返回來的數據:',res)#5、關閉套接字phone
phone.close()
3.客戶端數據
E:\python3\venv2\venv\Scripts\python.exe C:/Users/jinlin/Desktop/python_further_study/socket編程/客戶端.py
請輸入:12
服務器返回來的數據: b'12'
請輸入:wkkk
服務器返回來的數據: b'WKKK'
請輸入:我們
服務器返回來的數據: b'\xe6\x88\x91\xe4\xbb\xac'
請輸入:111嗯嗯嗯·
服務器返回來的數據: b'111\xe5\x97\xaf\xe5\x97\xaf\xe5\x97\xaf\xc2\xb7'
請輸入:
?
4.服務端數據
E:\python3\venv2\venv\Scripts\python.exe C:/Users/jinlin/Desktop/python_further_study/socket編程/服務器端.py
這是客戶端的請求數據 b'12'
這是客戶端的請求數據 b'wkkk'
這是客戶端的請求數據 b'\xe6\x88\x91\xe4\xbb\xac'
這是客戶端的請求數據 b'111\xe5\x97\xaf\xe5\x97\xaf\xe5\x97\xaf\xc2\xb7'
?
5.注:主要的循環通訊就是將服務器端和客戶端相應的接收消息代碼部分放在While True循環中,注意不要將套接字的關閉代碼放在循環中!!!
?