gevent实现端口转发

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个客户端组成)

端口映射--反向代理: 服务器端


下面是群友总结:

q - 服务端到客户端,反向
q - 这个方向不是指网站传输的方向,因为网络都是双向的
q - 而是指内容传输的方向。。
q - 那你把代理服务器理解为隐藏服务器。。
a - 表现在端口转发上有区别吗?
q - 如果这台服务器要隐藏的是用户,那么就是正向
q - 如果要隐藏服务器,就是反向。。
q - 我一个学校的学生只通过一台代理器访问外网,这就是隐藏客户,就是正向
q - 我的服务器集群只通过一个nginx反向代理服务器对外提供web服务,这就是隐藏服务器,这就是反向
q - 没区别 


你可能感兴趣的:(gevent)