仅用50行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)
(0)

相关推荐

  • Python实现简单的代理服务器

    本文实例讲述了Python实现简单的代理服务器.分享给大家供大家参考.具体如下: 具备简单的管理功能,运行后 telnet localhost 9000 端口可以进行管理主要功能就是做包转发,如果有一个桥服务器,可以用来外网访问内网用,还是很管用的 #/bin/env python #coding:utf-8 import socket,select,sys,time import thread s_list = [] def loop(cs,addr,s_ip,s_port): print '

  • python实现通过代理服务器访问远程url的方法

    本文实例讲述了python实现通过代理服务器访问远程url的方法.分享给大家供大家参考.具体如下: import urllib proxies = {'http' : 'http://proxy:80'} urlopener = urllib.FancyURLopener(proxies) htmlpage = urlopener.open('http://www.baidu.com') data = htmlpage.readlines() print data 希望本文所述对大家的Pytho

  • Python基于scrapy采集数据时使用代理服务器的方法

    本文实例讲述了Python基于scrapy采集数据时使用代理服务器的方法.分享给大家供大家参考.具体如下: # To authenticate the proxy, #you must set the Proxy-Authorization header. #You *cannot* use the form http://user:pass@proxy:port #in request.meta['proxy'] import base64 proxy_ip_port = "123.456.7

  • Python写的Socks5协议代理服务器

    直接上代码: #!/usr/bin/python # Filename s5.py # Python Dynamic Socks5 Proxy # Usage: python s5.py 1080 # Background Run: nohup python s5.py 1080 & import socket, sys, select, SocketServer, struct, time class ThreadingTCPServer(SocketServer.ThreadingMixIn

  • python实现简单的TCP代理服务器

    本文实例讲述了python实现简单的TCP代理服务器的方法,分享给大家供大家参考. 具体实现代码如下: # -*- coding: utf-8 -*- ''' filename:rtcp.py @desc: 利用python的socket端口转发,用于远程维护 如果连接不到远程,会sleep 36s,最多尝试200(即两小时) @usage: ./rtcp.py stream1 stream2 stream为:l:port或c:host:port l:port表示监听指定的本地端口 c:host

  • 仅用50行Python代码实现一个简单的代理服务器

    之前遇到一个场景是这样的: 我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A,然后再从A连接mongodb服务器B. 本来想通过ssh端口转发的,但是我没有从机器A连接ssh到B的权限.于是就自己用python写一个. 原理很简单. 1.开一个socket server监听连接请求 2.每接受一个客户端的连接请求,就往要转发的地址建一条连接请求.即client->proxy->forward.proxy既是socket服务端(监

  • 仅用500行Python代码实现一个英文解析器的教程

    语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理.自然语言引入了很多意外的歧义,以我们对世界的了解可以迅速地发现这些歧义.举一个我很喜欢的例子: 正确的解析是连接"with"和"pizza",而错误的解析将"with"和"eat"联系在了一起: 过去的一些年,自然语言处理(NLP)社区在语法分析方面取得了很大的进展.现在,小小的 Python 实现可能比广泛应用的 Stanford 解析器表现得更出色. 文章剩下

  • 使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym,只使用 Numpy 来创建 agent. 各位看官好,我(作者 Mike Shi--译者注)将在本文教大家如何用 50 行 Python 代码,教会 AI 玩一个简单的平衡游戏.我们会用到标准的 OpenAI Gym 作为测试环境,仅用 Numpy 创建我们的 AI,别的不用. 这个小游戏就是经典的

  • 只用50行Python代码爬取网络美女高清图片

    一.技术路线 requests:网页请求 BeautifulSoup:解析html网页 re:正则表达式,提取html网页信息 os:保存文件 import re import requests import os from bs4 import BeautifulSoup 二.获取网页信息 常规操作,获取网页信息的固定格式,返回的字符串格式的网页内容,其中headers参数可模拟人为的操作,'欺骗'网站不被发现 def getHtml(url): #固定格式,获取html内容 headers

  • 50行Python代码实现人脸检测功能

    现在的人脸识别技术已经得到了非常广泛的应用,支付领域.身份验证.美颜相机里都有它的应用.用iPhone的同学们应该对下面的功能比较熟悉 iPhone的照片中有一个"人物"的功能,能够将照片里的人脸识别出来并分类,背后的原理也是人脸识别技术. 这篇文章主要介绍怎样用Python实现人脸检测.人脸检测是人脸识别的基础.人脸检测的目的是识别出照片里的人脸并定位面部特征点,人脸识别是在人脸检测的基础上进一步告诉你这个人是谁. 好了,介绍就到这里.接下来,开始准备我们的环境. 准备工作 本文的人

  • 50行Python代码获取高考志愿信息的实现方法

    最近遇到个任务,需要将高考志愿信息保存成Excel表格,BOSS丢给我一个网址表格之后就让我自己干了.虽然我以前也学习过Python编写爬虫的知识,不过时间长了忘了,于是摸索了一天之后终于完成了任务.不得不说,Python干这个还是挺容易的,最后写完一看代码,只用了50行就完成了任务. 准备工作 首先明确一下任务.首先我们要从网址表格中读取到一大串网址,然后访问每个网址,获取到页面上的学校信息,然后将它们在写到另一个Excel中.显然,我们需要一个爬虫库和一个Excel库来帮助我们完成任务. 第

  • 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等场景. 目标检测的根本任务就是将图片或者视频中感兴趣的目标提取出来,目标的识别可以基于颜色.纹理.形状.其中颜色属性运用十分广泛,也比较容易实现.下面就向大家分享一个我做的小实验---通过OpenCV的Python接口来实现从视频中进行颜色识别和跟踪. 下面就是我们完整的代码实现(已调试运行): i

  • 仅用几行Python代码就能复制她的U盘文件?

    代码 # -*- coding:utf-8 -*- import os import time from datetime import datetime import shutil # U盘的盘符 usb_path = "E:/" # 要复制到的路径 save_path = "D:/haha" while (True):     if os.path.exists(usb_path):         shutil.copytree(usb_path, os.pa

  • 小 200 行 Python 代码制作一个换脸程序

    简介 在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸. 这个过程分四步: 检测脸部标记. 旋转.缩放.平移和第二张图片,以配合第一步. 调整第二张图片的色彩平衡,以适配第一张图片. 把第二张图像的特性混合在第一张图像中. 1.使用 dlib 提取面部标记 该脚本使用 dlib 的 Python 绑定来提取面部标记: Dlib 实现了 Vahid Kazemi 和 Josephine Sullivan 的<使用回归树一毫秒脸部对准>

  • 使用70行Python代码实现一个递归下降解析器的教程

     第一步:标记化 处理表达式的第一步就是将其转化为包含一个个独立符号的列表.这一步很简单,且不是本文的重点,因此在此处我省略了很多. 首先,我定义了一些标记(数字不在此中,它们是默认的标记)和一个标记类型: token_map = {'+':'ADD', '-':'ADD', '*':'MUL', '/':'MUL', '(':'LPAR', ')':'RPAR'} Token = namedtuple('Token', ['name', 'value']) 下面就是我用来标记 `expr` 表

随机推荐