【发布时间】:2020-09-13 07:30:03
【问题描述】:
我的程序使用地址('0.0.0.0', 0) 随机选择服务器端端口,并将唯一的code 发送到客户端,其中套接字试图连接到范围内的每个端口并检查相同的@987654324 @ 确认正确的服务器端口。
问题在于遍历所有端口(@987654325@),即使使用ThreadPool,尝试连接每个端口也非常慢。
这只是展示我正在尝试做的一个例子。我的主程序通过互联网而不是本地主机托管。
server.py
import socket
CODE = 'Code123' # just an example
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
addr = ('0.0.0.0', 0)
server.bind(addr)
# Can see which port is assigned
print(server)
def start():
server.listen(5) # connect to 5 connection.
while True:
conn, addr = server.accept()
conn.send(CODE.encode('utf-8'))
print("Code Sent")
start()
cilent.py
import socket
from multiprocessing.pool import ThreadPool
code = 'Code123' # just an example
server = socket.gethostbyname(socket.gethostname())
port_left = 65336
found = False
def connect(port):
global port_left, code, server, found
if found: return
port_left -= 1
try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((server, port))
if client.recv(len(code)).decode('utf-8') == code:
found = True
return client
else: client.close()
except Exception as e:
print(e, port_left)
return None
pool = ThreadPool(10)
values = [('c', i) for i in set(pool.map(connect, range(1024, 65336))) if i]
client = dict(values).get('c')
pool.close()
pool.join()
print(client)
有没有更好的方法来实现这个目标或提高我现有代码的性能?
【问题讨论】:
-
如果您这样考虑:如果您的服务器或客户端之一必须启动与另一个的对话,那么哪个更符合逻辑以具有服务所在的“固定”端口?在那里设置一个静态端口,然后回复该设备上消息来自的端口。
-
随机套接字的目的是什么,为什么不只是有一个固定的端口?这也避免了与其他服务器软件端口冲突的问题。
-
添加另一个如何思考的示例:HTTP 通常在 TCP 端口 80 上响应。因此,服务器有其 Web 服务服务于该端口上的 HTTP 请求。但是,客户端没有特定的 TCP 端口来发送请求,因此服务器会响应它接收消息的 TCP 端口。因此,他们可以互相交谈。
-
@HampusLarsson:如果该固定端口稍后被其他人占用并且我的脚本尝试连接同一个端口怎么办?
-
“如果那个固定端口后来忙了怎么办……”这应该永远不会发生。例如,如果服务器已配置并正在运行,则应该没有任何东西可以使用服务器上的该端口。你的思维方式有问题。请检查a list of well-known ports 并选择与您的应用程序完全相同的端口,或添加服务应使用的“备份”端口。
标签: python sockets networking multiprocessing threadpool