039.Python使用TCP實現多用戶並發


使用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()

執行服務端,然后開啟三個客戶端

結果如下

 

 

 多並發已經完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM