类似于服务器可以使用单个端口连接多个客户端,我希望此服务器也能够使用此相同端口连接到多个其他服务器,而不必在不同端口上有单独的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 An invalid argument is supplied“。
它似乎绑定到单个端口,我的程序只能充当客户端(连接到单个服务器),或者作为服务器(使用多线程连接多个客户端),但不能两者兼而有之。
简而言之,我希望许多服务器通过TCP相互连接,所有通信都使用单个端口。
发布于 2021-04-22 14:02:21
编辑: windows不支持同一台计算机上的多个服务器(请参阅评论)
在本例中,您只需定义另一个套接字变量,例如:"connection",而不是使用定义为server-socket的同一变量。但你还必须定义两个函数,然后在上面运行线程,否则它不会工作。例如:
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:我建议使用较低的端口号,因为这是有限制的。
https://stackoverflow.com/questions/67214281
复制