zoukankan      html  css  js  c++  java
  • python实现tcp代理

    1.代理流程图

    在这里插入图片描述

    2.实现代码

    #! usr/bin/python2
    import sys
    import socket
    import thread
    
    #handle local buffer
    def request_handler(buffer):
        return buffer
    #handle remote buffer
    def response_handler(buffer):
        return buffer
    
    #receive data from remote_server or remote_client
    def receive_from(connection):
        buffer=""
        connection.settimeout(2)
        try:
            while True:
                data=connection.recv(4096)
                if not data:
                    break
                buffer+=data
        except:
            pass
        return buffer
    
    def server_loop(local_host,local_port,remote_host,remote_port,receive_first):
    #作为服务器监听并接受remote_client连接
        server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        server.bind((local_host,local_port))
        server.listen(5)
    
        while True:
            client_socket,addr=server.accept()
            print("other client has connected to me")
            #打开一个线程处理与remote_client的连接,并作为客户端连接remote_server
            thread.start_new_thread(proxy_handler, (client_socket,remote_host,remote_port,receive_first))
            
    def proxy_handler(client_socket,remote_host,remote_port,receive_first):
    #作为客户端连接remote_server
        remote_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        remote_socket.connect((remote_host,remote_port))
        #判断是否先接受来自remote_server的信息
        if receive_first:
            remote_buffer=receive_from(remote_socket)
            print("from remote_server:
    "+remote_buffer)
            if len(remote_buffer):
                print("sending to client")
                client_socket.send(remote_buffer)
        while True:
        #接受来自remote_client的信息并存储在local_buffer
        #将local_buffer的信息再发送到remote_server
            local_buffer=receive_from(client_socket)
            if len(local_buffer):
                print("from client:
    "+local_buffer)
                local_buffer=request_handler(local_buffer)
                remote_socket.send(local_buffer)
                print("sent to remote_server")
        #接受来自remote_server的信息并存储在remote_buffer
        #将remote_buffer的信息再发送到remote_client
            remote_buffer=receive_from(remote_socket)
            if len(remote_buffer):
                print("from remote_server:
    "+remote_buffer)
                remote_buffer=request_handler(remote_buffer)
                client_socket.send(remote_buffer)
                print("sent to client")
            
            
                
    def main():
        if len(sys.argv[1:]) != 5:
            print("failed to input")
            sys.exit(0)
            
        local_host=sys.argv[1]
        local_port=int(sys.argv[2])
        
        remote_host=sys.argv[3]
        remote_port=int(sys.argv[4])
        
        receive_first=sys.argv[5]
        
        if "true" in receive_first:
            receive_first=True
        else:
            receive_first=False
            
        server_loop(local_host,local_port,remote_host,remote_port,receive_first)
    main()
    
  • 相关阅读:
    每日一道 LeetCode (30): 买卖股票的最佳时机
    每日一道 LeetCode (29):杨辉三角 II
    每日一道 LeetCode (28):杨辉三角
    每日一道 LeetCode (27):二叉树的最小深度
    分布式协调服务之Zookeeper集群部署
    JupyterLab 交互式笔记本的安装使用
    YOLOv4: Darknet 如何于 Ubuntu 编译,及使用 Python 接口
    YOLOv4: Darknet 如何于 Docker 编译,及训练 COCO 子集
    pybind11: C++ 工程如何提供 Python 接口
    Mysql锁
  • 原文地址:https://www.cnblogs.com/WTa0/p/11810794.html
Copyright © 2011-2022 走看看