python socket通訊
阿新 • • 發佈:2020-09-15
socket是一個模組, 又稱套接字,用來封裝 網際網路協議(應用層以下的層)。
socket可以實現網際網路協議 應用層以下的層 的工作,提高開發效率。
''' client.py啟動服務端後再啟動客戶端 ''' import socket #1.買手機 client = socket.socket() #拿到一個手機物件 #2.撥號 client.connect(('127.0.0.1',9527)) #客戶端的ip和port必須與伺服器一致 print('client is running') #3.通訊迴圈 #講話給對方聽 while True: send_data= input('客戶端>>>:') client.send(send_data.encode('utf-8')) #只能發bytes型別 data = client.recv(1024) if data.decode('utf-8') == 'q': break if len(data) == 0: break print(data.decode('utf-8')) #4.斷開連線 client.close()
''' server.py先啟動套接字服務端 注意: 客戶端傳送一次訊息,服務端就得接受一次,再發送訊息。''' import socket #1.買手機 server = socket.socket() #拿到一個手機物件 # print(server) # server是用來收發連結請求,建立連結 #2.綁手機卡 server.bind(('127.0.0.1',9527)) #0-65535 #本地迴環地址 ---》'127.0.0.1' #3.開機(半連線池) server.listen(5) #同一時刻,最大請求數為5個 實際==6 print('sever is running') #4.等待電話請求 #conn:指的是服務端往客戶端的管道 #conn,addr = server.accept() #(雙向連線的套接字物件,存放客戶端IP和埠的小元組)# print(conn) #conn代表雙向連結,用來收發連結 #5.迴圈實現可接受多個使用者訪問 while True: #等待電話接入 --->接入客戶端 # conn: 指的是服務端往客戶端的管道 conn,addr = server.accpt() print(addr) #實現迴圈通訊 while True: try: #監聽程式碼塊是否有異常出現 # 接受對方講話的內容 # data --->客戶端傳送過來的訊息 data = conn.recv(1024) #1024接受的最大位元組數bytes if len(data) == 0: break if data.decode('utf-8') == 'q': break print(data.decode('utf-8')) send_data = input('伺服器>>>:') #伺服器往客戶端傳送訊息 conn.send(send_data.encode('utf-8')) # 捕獲異常資訊,並列印 # e: 報錯資訊 except Exception as e: print(e) break #6.掛電話連線 conn.close()
併發實現套接字通訊
import socket #client client = socket.socket() client.connect(('127.0.0.1',9500)) print('Client is running') while True: msg = input('客戶端:').encode('utf-8') client.send(msg) data = client.recv(1024) print(data)
import socket from threading import Thread #server #封裝成函式 def communicate(conn): while True: #通訊迴圈 try: data = conn.recv(1024) if len(data) == 0: break print(data.decode('utf-8')) conn.send('好啊'.encode('utf-8')) except Exception as e: print(e) break conn.close() def server(backlog=5): server = socket.socket() server.bind(('127.0.0.1',9500)) server.listen(backlog) while True: #連結迴圈 conn,addr = server.accept() print(addr) t = Thread(target=communicate,args=(conn,)) t.start() if __name__ == '__main__': t = Thread(target=server) t.start()
版本二:半連線池版
import socket #client client = socket.socket() client.connect(('127.0.0.1',9500)) print('Client is running') while True: msg = input('客戶端:').encode('utf-8') client.send(msg) data = client.recv(1024) print(data)
import socket from concurrent.futures import ThreadPoolExecutor server = socket.socket() server.bind(('127.0.0.1',9500)) server.listen(5) #封裝成一個函式 def run(conn): while True: try: data = conn.recv(1024) if len(data) == 0: break print(data.decode('utf-8')) conn.send('好啊'.encode('utf-8')) except Exception as e: print(e) break conn.close() if __name__ == '__main__': print('Server is running') pool = ThreadPoolExecutor(100) while True: conn,addr = server.accept() pool.submit(run,conn)