如何在Python中转发套接字连接?

如何在Python中转发套接字连接?,python,python-3.x,sockets,client-server,Python,Python 3.x,Sockets,Client Server,如果有两个独立的服务器应用程序:例如ServerAppAlpha和ServerAppBeta,其中一个(ServerAppAlpha)应从客户端接收套接字连接: # ServerAppAlpha import socket svr = socket.socket(socket.AF_INET, socket.SOCK_STREAM) svr.bind(('127.0.0.1', 9090)) svr.listen(5) while (True): conn, addr = svr.

如果有两个独立的服务器应用程序:例如ServerAppAlpha和ServerAppBeta,其中一个(ServerAppAlpha)应从客户端接收套接字连接

# ServerAppAlpha

import socket

svr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
svr.bind(('127.0.0.1', 9090))
svr.listen(5)

while (True):
    conn, addr = svr.accept() 
    from_clnt = svt.recv(4096)
    # conn == <socket.socket fd=552, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9090), raddr=('127.0.0.1', 53006)>

    svr2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    svr2.connect(('127.0.0.2', 9090))
    # somehow forward both "conn" and "from_clnt" to ServerAppBeta"
此外,客户端应用程序如下所示:

# ClientApp

import socket

clnt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clnt.connect(('127.0.0.1', 9090))
clnt.send('SampleRequest'.encode()) # Sends to ServerAppAlpha
clnt.recv(4096) # Receives from ServerAppBeta
主要目标是拥有一个透明的分布式系统,以便客户机“感觉”与单个服务器打交道。因此,问题是:

  • 如何将连接从一台服务器转发到另一台服务器
  • 客户机如何向一台服务器发送请求并从另一台服务器接收响应

  • 您不能转发“连接”。您只能通过从一侧读取数据并将读取的内容写入另一侧来转发数据,然后对两个方向执行此操作。因此,是否有一种方法可以从ServerAppBeta上的
    创建对象,并以某种方式使用
    填充参数(客户端
    conn
    已转换为字符串),这样它就可以直接连接并响应客户端了?不,这是不可能的。客户端不希望此端口上有来自ServerAppBeta的任何数据,即连接尝试将失败。如果ServerAppBeta在同一系统上运行,您可以使用套接字描述符让ServerAppAlpha调用ServerAppBeta,然后从该描述符初始化套接字。不过,不确定这在windows中是否有效。否则,您可以使用多处理或多线程模块打开一个线程或进程,并将套接字对象作为参数传递。尽管我不得不承认,我只是用线程测试了一下。但是,如果您有多个系统,这对您没有多大好处。在unix(或linux)系统上,可以通过unix域套接字将套接字文件描述符传递给另一个进程。请参阅以下答案:。我从来没有在python程序中看到过它,但没有理由不这样做。实现起来会很繁琐,可能需要使用
    ctypes
    模块,但这是可能的。
    # ClientApp
    
    import socket
    
    clnt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clnt.connect(('127.0.0.1', 9090))
    clnt.send('SampleRequest'.encode()) # Sends to ServerAppAlpha
    clnt.recv(4096) # Receives from ServerAppBeta