如本文件中所提及: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