仅用50行Python代码实现一个简单的代理服务器
作者:goldensun 发布时间:2022-11-26 14:44:57
标签:Python,代理
之前遇到一个场景是这样的:
我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A,然后再从A连接mongodb服务器B。
本来想通过ssh端口转发的,但是我没有从机器A连接ssh到B的权限。于是就自己用python写一个。
原理很简单。
1.开一个socket server监听连接请求
2.每接受一个客户端的连接请求,就往要转发的地址建一条连接请求。即client->proxy->forward。proxy既是socket服务端(监听client),也是socket客户端(往forward请求)。
3.把client->proxy和proxy->forward这2条socket用字典给绑定起来。
4.通过这个映射的字典把send/recv到的数据原封不动的传递
下面上代码。
#coding=utf-8
import socket
import select
import sys
to_addr = ('xxx.xxx.xx.xxx', 10000)#转发的地址
class Proxy:
def __init__(self, addr):
self.proxy = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.proxy.bind(addr)
self.proxy.listen(10)
self.inputs = [self.proxy]
self.route = {}
def serve_forever(self):
print 'proxy listen...'
while 1:
readable, _, _ = select.select(self.inputs, [], [])
for self.sock in readable:
if self.sock == self.proxy:
self.on_join()
else:
data = self.sock.recv(8096)
if not data:
self.on_quit()
else:
self.route[self.sock].send(data)
def on_join(self):
client, addr = self.proxy.accept()
print addr,'connect'
forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
forward.connect(to_addr)
self.inputs += [client, forward]
self.route[client] = forward
self.route[forward] = client
def on_quit(self):
for s in self.sock, self.route[self.sock]:
self.inputs.remove(s)
del self.route[s]
s.close()
if __name__ == '__main__':
try:
Proxy(('',12345)).serve_forever()#代理服务器监听的地址
except KeyboardInterrupt:
sys.exit(1)


猜你喜欢
- Django的信号Django的信号机制不同于Linux的信号机制,Django 中的信号用于在框架执行操作时解耦。当某些动作发生的时候,系
- 代码如下所示:表landundertake结构如下所示:表appraiser结构如下所示:access代码:代码如下:TRANSFORM F
- 需要画框取消注释rectangleimport cv2import os,sys,shutilimport numpy as np# Ope
- 错误现象:ERROR 1045 (28000): Access denied for user 'ODBC'@'lo
- drop table if exists dd; create table dd ( user_id int , class_no int
- 检测这些圆,先找轮廓后通过轮廓点拟合椭圆import cv2import numpy as npimport matplotlib.pypl
- 在SQL Server中联机丛书是这样说的: SQL Server timestamp 数据类型与时间和日期无关。SQL Server ti
- 前言:python虽然是一门'慢语言',但是也有着比较多的性能检测工具来帮助我们优化程序的运行效率。这里总结了五个比较好的p
- 一、与字典值有关的计算问题想对字典的值进行相关计算,例如找出字典里对应值最大(最小)的项。解决方案一:假设要从字典 {'a'
- Python socket网络编程初学 python,前段时间买了两本书《python 编程从入门到实践》《Python 核心编程第三版》,
- 1、异常简介从软件方面来说,错误是语法或是逻辑上的,当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了
- 大概来介绍一下 Django Allauth 改造的期间遇到的一些问题和改造方法,在此之前我只想说——Django Allauth 是屑。为
- 本文通过图文并茂的方式给大家展示SQL SERVER数据库表记录只保留N天图文教程,具体方法步骤请看下文:第一步:首先设置SQL Serve
- 在开始之前还是提一下三个函数吧:"ob_start()、ob_end_clean()、ob_get_contents()"
- 前言事务性数据字典与原子DDL,是MySQL 8.0推出的两个非常重要的新特性,之所以将这两个新特性放在一起,是因为两者密切相关,事务性数据
- 昨天十行代码实现文字识别,感觉怎样,是不是很爽今天咋们继续利用pillow和pytesseract来实现验证码的识别一、环境配置需要 pil
- 本文实例分析了JS限制条件补全问题。分享给大家供大家参考,具体如下:题目一.a和b两个变量,不用第三个变量来切换两个变量值var a=5;v
- 项目介绍:Golang100行代码实现高并发聊天室,其中实现的功能有:上下线广播,私聊,用户改名,超时强踢,在线用户检测等在开始项目前,我们
- 在网上看到一个小需求,需要用正则表达式来处理。原需求如下:找出文本中包含”因为……所以”的句子,并以两个词为中心对齐输出前后3个字,中间全输
- 工具安装主要调用win32库实现分辨率获取和读写,需要安装pywin32示例中是从execl列表中读取需要设置的分辨率,需要安装xlrd用到