socketsocket
什麼是socket?tcp
socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口,它把複雜的TCP/IP協議族隱藏在socket接口後面,對用戶來講,一組簡單的接口就是所有。spa
爲何使用socket?code
socket幫咱們把複雜的TCP/IP協議族封裝好了,咱們只須要調用socket的接口。blog
怎麼用?接口
基於tcp的套接字(socket):ip
服務端:服務端就至關於手機通訊過程utf-8
import socket #一、買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp稱爲流式協議,udp稱爲數據報協議SOCK_DGRAM # print(phone) #二、插入/綁定手機卡 # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) phone.bind(('127.0.0.1',8080)) #三、開機 phone.listen(5) # 半鏈接池,限制的是請求數 #四、等待電話鏈接 print('start....') conn,client_addr=phone.accept() #(三次握手創建的雙向鏈接,(客戶端的ip,端口)) # print(conn) print(client_addr) #五、通訊:收\發消息 data=conn.recv(1024) #最大接收的字節數 print('來自客戶端的數據',data) conn.send(data.upper()) # import time # time.sleep(500) #六、掛掉電話鏈接 conn.close() #七、關機 phone.close()
客戶端:客戶端至關於找電話亭給他人打電話過程input
import socket #一、找電話亭 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) print(phone) #二、撥電話 phone.connect(('127.0.0.1',8080)) # 指定服務端ip和端口 #三、通訊:發\收消息 phone.send('hello'.encode('utf-8')) # phone.send(bytes('hello',encoding='utf-8')) data=phone.recv(1024) print(data) # import time # time.sleep(500) #四、掛機 phone.close()
爲服務端與客戶端加上鍊接循環與通訊循環io
服務端:
import socket #一、買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp稱爲流式協議,udp稱爲數據報協議SOCK_DGRAM #二、插入/綁定手機卡 # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 防止地址仍被佔用時報錯 phone.bind(('127.0.0.1',8080)) #三、開機 phone.listen(5) # 半鏈接池,限制的是請求數 #四、等待電話鏈接 print('start....') while True: # 鏈接循環 conn,client_addr=phone.accept() #(三次握手創建的雙向鏈接,(客戶端的ip,端口)) # print(conn) print('已經有一個鏈接創建成功',client_addr) #五、通訊:收\發消息 while True: # 通訊循環 try: print('服務端正在收數據...') data=conn.recv(1024) #最大接收的字節數,沒有數據會在原地一直等待收,即發送者發送的數據量必須>0bytes # print('===>') if len(data) == 0:break #在客戶端單方面斷開鏈接,服務端纔會出現收空數據的狀況 print('來自客戶端的數據',data) conn.send(data.upper()) except ConnectionResetError: break #六、掛掉電話鏈接 conn.close()
客戶端
#一、買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # print(phone) #二、撥電話 phone.connect(('127.0.0.1',8080)) # 指定服務端ip和端口 #三、通訊:發\收消息 while True: # 通訊循環 msg=input('>>: ').strip() #msg='' if len(msg) == 0:continue phone.send(msg.encode('utf-8')) # print('has send----->') data=phone.recv(1024) # print('has recv----->') print(data)