geventポート転送を実現

2001 ワード

tcpforward_gevent.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# tcp    
# https://gist.github.com/phuslu/3910331
 
import sys
import os
 
import gevent
import gevent.server
import gevent.queue
 
CONNECTION_QUEUE = gevent.queue.Queue()
BUFFER_SIZE = 65536
 
def io_copy(source, dest):
    wfile = dest.makefile('wb', BUFFER_SIZE)
    while 1:
        wfile.write(source.recv(BUFFER_SIZE))
 
def forward():
    connection_map = {}
    while 1:
        myid, conn_type, conn = CONNECTION_QUEUE.get()
        if myid not in connection_map:
            connection_map[myid] = (conn_type, conn)
        else:
            _, conn_in_map = connection_map[myid]
            if conn_type:
                gevent.spawn(io_copy, conn, conn_in_map)
            else:
                gevent.spawn(io_copy, conn_in_map, conn)
 
def producer_handler(sock, address):
    myid = sock.recv(1024)
    CONNECTION_QUEUE.put((myid, 1, sock))
 
def consumer_handler(sock, address):
    myid = sock.recv(1024)
    CONNECTION_QUEUE.put((myid, 0, sock))
 
def main():
    producer_server = gevent.server.StreamServer(('', 44445), producer_handler)
    producer_server.start()
    consumer_server = gevent.server.StreamServer(('', 44444), consumer_handler)
    consumer_server.start()
    forward()
 
if __name__ == '__main__':
    main()

ポート転送--フォワードエージェント:リモートサーバを自分のサーバ(エージェントサーバ)にコピーします.ユーザがエージェントサーバにアクセスすることは、リモートサーバにアクセスすることと同様に、エージェントサーバの圧力が大きい.ユーザ向けはサービス側であり、リモートサーバ向けはクライアントであり、各ユーザの接続は、エージェントサーバがユーザとの接続を維持するとともに、ユーザにリモートサーバへの接続を確立し、データをユーザに転送するためである.(プロキシサーバはサービス側+nクライアントからなる)
≪ポート・マッピング|Port Mapping|ldap≫:リバース・エージェント:サーバー・エンド
以下はグループのまとめです.
q−サービス側はクライアントに、逆q−という方向はウェブサイトの伝送の方向を指すのではなく、ネットワークが双方向のq−であるため、コンテンツの伝送の方向を指す.q-では、エージェントサーバを非表示サーバと理解します.a-ポート転送に違いがありますか?q-このサーバがユーザを隠す場合は、順方向q-サーバを隠す場合は逆方向です.q-私の学校の学生は1台のエージェントだけを通じて外網にアクセスして、これは取引先を隠して、q-私のサーバーのクラスタは1つのnginxの逆エージェントのサーバーだけを通じて対外的にwebサービスを提供して、これはサーバーを隠して、これは逆q-区別がありません