是否可以让 3 台服务器使用 Python 套接字在一个端口(比如端口 48000)上相互通信
Posted
技术标签:
【中文标题】是否可以让 3 台服务器使用 Python 套接字在一个端口(比如端口 48000)上相互通信【英文标题】:Is it possible to have 3 servers communicating to each other all on a single port (say port 48000) using Python sockets 【发布时间】:2021-04-22 13:30:23 【问题描述】:类似于服务器如何让多个客户端使用单个端口连接到它,我希望该服务器也能够使用同一端口连接到多个其他服务器,而不必在一个单独的 TCP 客户端套接字上不同的端口。
例如。服务器 1、2 和 3 都使用单个端口(例如 48000)相互通信,而不是每个都在 48000 上托管一个 TCP 套接字,并且还必须在两个额外端口上创建另外两个 TCP 客户端套接字以与其他两个服务器通信.
这样做的原因是分布式应用程序理论上可以扩展到超过 65k 台服务器,这些服务器可能全部相互连接,这会导致每个服务器用尽可用端口来创建客户端套接字。
更具体地说,这是否可以使用 Python 和套接字库来实现?
这段代码不是文字,只是代表我的程序试图实现的目标。
self.tcp_socket.bind(("", 48000))
# Server thread
self.tcp_socket.listen()
client, address = self.tcp_socket.accept()
# Connecting to other server as client
self.tcp_socket.connect((192.168.1.10, 48000))
当尝试使用已用作服务器的套接字连接到服务器时(监听,接受),我收到错误“[WinError 10022] 提供了无效参数”。
它似乎绑定到单个端口,我的程序只能充当客户端(连接到单个服务器),或充当服务器(有多个客户端使用多线程连接),但不能同时充当两者。
简而言之,我希望许多服务器通过 TCP 相互连接,使用单个端口进行所有通信。
【问题讨论】:
如果您将已建立的连接视为 5 元组,它可能会帮助您更好地理解冲突以及如何避免它们。连接 5 元组由协议 (tcp)、本地套接字(即 IP 和端口)和远程套接字组成。想象一下这个服务器端:(tcp, 10.10.10.10, 1025, 192.168.1.10, 48000),对于同一个连接客户端,想象一下:(tcp, 192.168.1.10, 48000, 10.10.10.10, 1025)。只要单个主机不尝试创建两个相同的 5 元组(忽略服务器/客户端语义)就可以了。 (**客户端本地 ip 和端口通常是自动选择的) 这听起来像是一个 x-y 问题 - 您要解决的实际问题是什么? @barny 我的“解决方案”并不是真正的解决方案,我只是将其添加以展示我尝试过但不起作用的方法。我要解决的问题是在各自的 IP 上拥有多个服务器,在单个端口上托管服务,它们可以接收来自其他服务器的连接,但也可以通过此端口启动与其他服务器的连接。本质上,所有通信都将在一个端口上完成。 【参考方案1】:编辑:windows 不支持同一台机器上的多个服务器(参考 cmets) 在您的情况下,您只需要定义另一个套接字变量,例如:“connection”,而不是使用定义为服务器套接字的相同变量。但是你还必须定义两个函数,然后在这个函数上运行线程,否则它不会工作。例如:
from threading import Thread
def bind():
tcp_socket.bind(("", 4444))
# Server thread
tcp_socket.listen()
client, address = tcp_socket.accept()
def connect():
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection.connect((192.168.1.10, 4444))
t1 = Thread(target=bind)
t2 = Thread(target=connect)
t1.start()
t2.start()
PS:我建议使用较低的端口号,因为有限制。
【讨论】:
问题在于,对于我需要连接的每台服务器,我必须使用新端口创建一个新的客户端连接,这不是我想做的。我只想对来自/到所有服务器的所有连接使用单个端口。他们每个人都将拥有唯一的 IP。理论上这是可能的,正如 marklap 所说,这些都是唯一的 IP/端口元组,只是我希望能够从服务器套接字充当客户端。 据我所知,Windows 不支持同一 IP 和端口上的多个服务器。从技术上讲,这是可能的,但这取决于您正在使用的操作系统以及使用哪种语言。无论如何,这不会像我上面显示的那样起作用。以上是关于是否可以让 3 台服务器使用 Python 套接字在一个端口(比如端口 48000)上相互通信的主要内容,如果未能解决你的问题,请参考以下文章