如本文件中所提及:Python socket.accept()Python:同一套接字對象如何服務於不同的客戶端?
接受連接。套接字必須綁定到一個地址,並且監聽連接。返回值是一對(conn,地址) 其中conn是一個新的套接字對象,可用於發送和接收連接上的數據,地址是綁定到連接另一端的套接字的地址。
新創建的套接字是不可繼承的。
在版本3.4中更改:套接字現在是不可繼承的。
服務器代碼
>>> from socket import *
>>> sock = socket(AF_INET, SOCK_STREAM)
>>> sock.bind(("localhost", 20000))
>>> sock.getsockname()
('127.0.0.1', 20000)
>>> sock.listen(1)
>>> while True:
... conn, address = sock.accept()
... print("Address of client : {0}".format(address))
... print("Address of socket : {0}".format(conn.getsockname()))
...
Address of client : ('127.0.0.1', 47165)
Address of socket : ('127.0.0.1', 20000)
Address of client : ('127.0.0.1', 47166)
Address of socket : ('127.0.0.1', 20000)
客戶端代碼
>>> from socket import *
>>> sclient1 = socket(AF_INET, SOCK_STREAM)
>>> sclient2 = socket(AF_INET, SOCK_STREAM)
>>> sclient1.connect(("localhost", 20000))
>>> sclient2.connect(("localhost", 20000))
返回的新socket
對象的地址,始終是和原來一樣socket
裏面竟是接受連接。
我一直認爲,服務器將創建一個不同的隨機端口新socket
對象,但是從上面可以看出,即使對於多個客戶端,新conn
對象的地址和端口仍然是相同的。那麼服務器如何能夠處理多個客戶端?
編輯:我知道上面的代碼是阻塞的。如果我使用多個線程來處理不同的客戶端連接,則必須將新的套接字對象和客戶端地址發送給我的線程函數。因此,多個線程然後使用相同的服務器地址和端口處理多個客戶端。
線程服務器
>>> from socket import *
>>> import threading
>>> def handler(conn, address):
... print("Address of client : {0}".format(address))
... print("Address of socket : {0}".format(conn.getsockname()))
...
>>> sock = socket(AF_INET, SOCK_STREAM)
>>> sock.bind(("localhost", 20000))
>>> sock.listen(1)
>>> while 1:
... conn, address = sock.accept()
... t = threading.Thread(target=handler, args=[conn, address])
... t.start()
...
Address of client : ('127.0.0.1', 47169)
Address of socket : ('127.0.0.1', 20000)
Address of client : ('127.0.0.1', 47170)
Address of socket : ('127.0.0.1', 20000)
讓我重新說一句:你的印象是,如果你聽,例如,端口'10000'和客戶端連接,每個客戶端連接都會獲得一個隨機的服務器端口來識別連接? – dhke
@dhke是的,我做到了! –
你在混淆套接字和端口。一個服務器端*端口*是所有必需的,但服務器需要每個連接有一個*套接字*。 – EJP