socket實現處理多個連接 |
實現處理多個連接
使用whlie循環實現多個客戶端,排隊請求服務端
循環監聽端口發送信息(windos,Linux)
1.Linux 系統如果客戶端斷開連接,會循環打印
2.Windos 系統如果客戶端斷開連接,會報錯中斷
3.案例:在linux系統下實現
4.需求:可以實現單個用戶斷開,並同過排隊對服務端訪問。
客戶端
#客戶端Linux系統下:輸入命令通過服務端返回 import socket #聲明協議類型,同事生成socket連接對象 client = socket.socket() #鏈接地址和端口,元組(本地,端口) client.connect(('localhost',6969)) #使用input循環向服務端發送請求 while True: msg = input(">>:").strip() if len(msg) == 0:continue #發送數據 b將字符串轉為bys類型 client.send(msg.encode("utf-8")) #接收服務器端的返回,需要聲明收多少,默認1024字節 data = client.recv(1024) #打印data是recv的data print("recv:",data) #關閉接口 client.close()
服務端
#服務端Linux系統下:處理命令並返回 import socket import os #聲明類型,生成socket鏈接對象 server = socket.socket() #監聽接收端口元組(本地,端口),綁定要監聽的端口 server.bind(('localhost',6969)) #1.監聽 #2.“5”最大監聽數,允許多少人在排隊 server.listen(5) print("我要開始等待客戶端了") #循環鎖定訪問客戶端 while True: #1.等待客戶端 #會返回鏈接的標記位conn,與連接的地址 #2.客戶端同過conn,addr進行通話 #3.conn就是客戶端連接過來而在服務器端為其生成的一個連接實例 conn,addr = server.accept() #查看標記位與IP地址 print(conn,addr) print("客戶端 他 進來了!") #循環處理客戶端請求 while True: #1.接收數據,1024字節 #2.如果發不完會存在緩沖去,下次在發送。 #3.緩沖區每次最多發32768字節 #4.每個系統不同,超出數值會有限制。 data = conn.recv(102400) #返回 print(data) #Linux系統內可以判斷是否為空。 if not data:break #執行命令,賦值給變量 res = os.popen(data).read() #返回一個值,返回res命令 conn.send(res) #sendll就是循環send,用法發送大型文件。 #conn.sendll(res) #關閉鏈接 server.close()