Python-Socket编程-Socket.accept()不创建新的套接字



给定服务器代码:

import socket
HOST = 'localhost'
PORT = 65200
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
while True:
c, addr = s.accept()
with c:
client_addr = c.getsockname()[0]
client_port = c.getsockname()[1]
print('Connected to client address: {} port: {}'.format(client_addr, client_port))

给定客户端代码:

import socket
connections = {}
SRC_HOST = 'localhost'
SRC_PORT = 65300
# Create 5 connections
for i in range(5):
connections[i] = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connections[i].bind((HOST, SRC_PORT + i))
DEST_HOST = 'localhost'
DEST_PORT = 65200
# For each connection, send one message
for s in connections.keys():
connections[s].connect((DEST_HOST, DEST_PORT))
connections[s].sendall(b'Hello world!')
# Close active connections
for s in connections.keys():
connections[s].close()

在服务器代码的输出中,为什么套接字对象c的端口对于每个连接的客户端都保持65200?

Connected to client address: 127.0.0.1 port: 65200
Connected to client address: 127.0.0.1 port: 65200
Connected to client address: 127.0.0.1 port: 65200
Connected to client address: 127.0.0.1 port: 65200
Connected to client address: 127.0.0.1 port: 65200

根据套接字上的Python文档,socket.accept((应返回(c,addr(,其中c是从侦听队列检索到的每个新连接的新套接字对象。

假设一个新的套接字对象需要一个唯一的端口,我错了吗?如果是这样的话,如果所有连接的客户端的端口都是65200,那么服务器代码将如何区分它们?

换句话说,如果我只想向客户端(localhost,65302(发送响应,而不想向其他连接的客户端发送响应,该怎么办?

https://docs.python.org/3/library/socket.html

socket.getsockname((返回套接字自己的地址。

所以您正在读取服务器地址。每个传输层连接都是一个5元组(prot、source_addr、sorce_port、destination_addr和destination_port(,其中整体组合必须是唯一的。如果这五种联系中有一种不同,那么它就是另一种可识别的联系,因此在pararell中存在是合法的。您可以通过在代码中将SRC_PORT增加i来实现这一点。

最新更新