【发布时间】:2015-12-12 21:38:03
【问题描述】:
如文档中所述:Python socket.accept()
接受连接。套接字必须绑定到一个地址并且 监听连接。返回值是一对 (conn, address) 其中 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和客户端连接,每个客户端连接获取一个随机的服务器端口来识别连接? -
您混淆了套接字和端口。只需要一个服务器端 port,但服务器每个连接都需要一个 socket。