使用TCP實現多用戶並發
在前面的實驗中,TCP建立連接時,只能允許一個用戶連接,當第二個用戶建立連接時,發送的信息,服務端是沒有辦法接受,只有當第一個用戶退出時,才能接受到第二個用戶的請求,並實現通信
但是UDP可以實現多用戶
1 UDP的多並發
服務端
#服務端 import socket #創建對象 socket.SOCK_DGRAM 代表UDP協議 sk = socket.socket(type=socket.SOCK_DGRAM) #在網絡中注冊該主機 sk.bind ( ("127.0.0.1",9000) ) #udp服務器,第一次啟動時,一定是先接收數據,在發送數據 while True: msg,cli_addr = sk.recvfrom(1024) print (msg.decode("utf-8")) print (cli_addr) #發送消息 message = input("Please input your vaule>>>:") sk.sendto(message.encode("utf-8"),cli_addr) #關閉udp連接 sk.close()
客戶端
import socket sk = socket.socket(type=socket.SOCK_DGRAM) #sendto (要發送的消息,(IP地址,端口號)) while True: message = input("Please input the value:") sk.sendto (message.encode("utf-8"),("127.0.0.1",9000) ) #接收數據 msg,ser_addr = sk.recvfrom(1024) print (msg.decode("utf-8")) #關閉連接 sk.close()
一個client建立連接
[root@node10 tcp]# python3 server.py Hi,I am the first client ('127.0.0.1', 34937) Please input your vaule>>>:Hi first client [root@node10 tcp]# python3 client.py Please input the value:Hi,I am the first client Hi first client
再使用一個client連接
三個之間進行通信
服務端 [root@node10 tcp]# python3 server.py Hi,I am the first client ('127.0.0.1', 44633) Please input your vaule>>>:Hi first client Hi ('127.0.0.1', 44633) Please input your vaule>>>:Hi Hi,I am the first client2 ('127.0.0.1', 56953) Please input your vaule>>>:Hi,welcome,client 2 thank you ('127.0.0.1', 56953) Please input your vaule>>>:yes OK ('127.0.0.1', 44633) Please input your vaule>>>:ok 第一個clent [root@node10 tcp]# python3 client.py Please input the value:Hi,I am the first client Hi first client Please input the value:Hi Hi Please input the value:OK ok 第二個client [root@node10 tcp]# python3 client.py Please input the value:Hi,I am the first client2 Hi,welcome,client 2 Please input the value:thank you yes
2 調用sockerserver模塊
服務端
#服務端 import socketserver import socket class MyServer(socketserver.BaseRequestHandler): def handle(self): #自定義邏輯 print ("This is tcp funaction") #生成一個對象 server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000),MyServer ) #循環調用 server.serve_forever()
客戶端
import socket sk = socket.socket() sk.connect( ("127.0.0.1",9000) ) sk.close()
執行
[root@node10 tcp]# python3 server.py This is tcp funaction #這里一直阻塞,等待客戶端連接 [root@node10 tcp]# python3 client.py
因為客戶端沒有循環,執行就直接退出,無法看出並發
3 BaseRequestHandle的底層邏輯
服務端
#服務端 import socketserver import socket class MyServer(socketserver.BaseRequestHandler): def handle(self): #自定義邏輯 print ("This is tcp funaction") print (self.request) print (self.client_address) #生成一個對象 server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000),MyServer ) #循環調用 server.serve_forever()
執行
This is tcp funaction <socket.socket fd=4,
family=AddressFamily.AF_INET,
type=SocketKind.SOCK_STREAM,
proto=0,
laddr=('127.0.0.1', 9000),
raddr=('127.0.0.1', 44428)> ('127.0.0.1', 44428)
4 添加循環不退出
服務端
#服務端 import socketserver import socket class MyServer(socketserver.BaseRequestHandler): def handle(self): #自定義邏輯 print ("This is tcp funaction") conn = self.request while True: msg = conn.recv(1024) print(msg.decode("utf8")) conn.send(b"world") #生成一個對象 server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000),MyServer ) #循環調用 server.serve_forever()
客戶端
import socket sk = socket.socket() sk.connect( ("127.0.0.1",9000) ) while True: # 發消息 sk.send(b"hello") # 接收服務器消息 msg = sk.recv(1024) print(msg.decode("utf-8")) sk.close()
執行服務端,然后開啟三個客戶端
結果如下
多並發已經完成