本文实例讲述了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:port表示监听远程指定的端口

@author: watercloud, zd, knownsec team

@web: www.knownsec.com, blog.knownsec.com

@date: 2009-7

'''

import socket

import sys

import threading

import time

streams = [None, None] # 存放需要进行数据转发的两个数据流(都是SocketObj对象)

debug = 1 # 调试状态 0 or 1

def _usage():

print 'Usage: ./rtcp.py stream1 stream2\nstream : l:port or c:host:port'

def _get_another_stream(num):

'''

从streams获取另外一个流对象,如果当前为空,则等待

'''

if num == 0:

num = 1

elif num == 1:

num = 0

else:

raise "ERROR"

while True:

if streams[num] == 'quit':

print("can't connect to the target, quit now!")

sys.exit(1)

if streams[num] != None:

return streams[num]

else:

time.sleep(1)

def _xstream(num, s1, s2):

'''

交换两个流的数据

num为当前流编号,主要用于调试目的,区分两个回路状态用。

'''

try:

while True:

#注意,recv函数会阻塞,直到对端完全关闭(close后还需要一定时间才能关闭,最快关闭方法是shutdow)

buff = s1.recv(1024)

if debug > 0:

print num,"recv"

if len(buff) == 0: #对端关闭连接,读不到数据

print num,"one closed"

break

s2.sendall(buff)

if debug > 0:

print num,"sendall"

except :

print num,"one connect closed."

try:

s1.shutdown(socket.SHUT_RDWR)

s1.close()

except:

pass

try:

s2.shutdown(socket.SHUT_RDWR)

s2.close()

except:

pass

streams[0] = None

streams[1] = None

print num, "CLOSED"

def _server(port, num):

'''

处理服务情况,num为流编号(第0号还是第1号)

'''

srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

srv.bind(('0.0.0.0', port))

srv.listen(1)

while True:

conn, addr = srv.accept()

print "connected from:", addr

streams[num] = conn # 放入本端流对象

s2 = _get_another_stream(num) # 获取另一端流对象

_xstream(num, conn, s2)

def _connect(host, port, num):

''' 处理连接,num为流编号(第0号还是第1号)

@note: 如果连接不到远程,会sleep 36s,最多尝试200(即两小时)

'''

not_connet_time = 0

wait_time = 36

try_cnt = 199

while True:

if not_connet_time > try_cnt:

streams[num] = 'quit'

print('not connected')

return None

conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:

conn.connect((host, port))

except Exception, e:

print ('can not connect %s:%s!' % (host, port))

not_connet_time += 1

time.sleep(wait_time)

continue

print "connected to %s:%i" % (host, port)

streams[num] = conn #放入本端流对象

s2 = _get_another_stream(num) #获取另一端流对象

_xstream(num, conn, s2)

if __name__ == '__main__':

if len(sys.argv) != 3:

_usage()

sys.exit(1)

tlist = [] # 线程列表,最终存放两个线程对象

targv = [sys.argv[1], sys.argv[2] ]

for i in [0, 1]:

s = targv[i] # stream描述 c:ip:port 或 l:port

sl = s.split(':')

if len(sl) == 2 and (sl[0] == 'l' or sl[0] == 'L'): # l:port

t = threading.Thread(target=_server, args=(int(sl[1]), i))

tlist.append(t)

elif len(sl) == 3 and (sl[0] == 'c' or sl[0] == 'C'): # c:host:port

t = threading.Thread(target=_connect, args=(sl[1], int(sl[2]), i))

tlist.append(t)

else:

_usage()

sys.exit(1)

for t in tlist:

t.start()

for t in tlist:

t.join()

sys.exit(0)

完整实例代码点击此处本站下载。

希望本文所述对大家的Python程序设计有所帮助。

python接入讯代理_python实现简单的TCP代理服务器相关推荐

  1. python tcp协议加代理_python实现简单的TCP代理服务器

    本文实例讲述了python实现简单的TCP代理服务器的方法,分享给大家供大家参考. 具体实现代码如下: # -*- coding: utf-8 -*- ''' filename:rtcp.py @de ...

  2. python接入讯代理_scrapy中使用讯代理动态转发

    scrapy源代码中查找http11.py文件,相对路径为: Lib/site-packages/scrapy/core/downloader/handlers/http11.py 找到下面内容,注释 ...

  3. python接入讯代理_scrapy添加讯代理 动态转发(Python3)

    1. 先行条件 将scrapy源代码,相对路径为:Lib/site-packages/scrapy/core/downloader/handlers/http11.py的文件中, if isinsta ...

  4. python 设置全局代理_Python中使用socks5设置全局代理的方法示例

    0x01介绍 PySocks使您可以通过SOCKS和HTTP代理服务器发送流量.它是SocksiPy的现代分支,具有错误修复和其他功能. 0x02 安装 λ pip3 install Pysocks ...

  5. python股票数据分析实例_Python之简单股票数据分析

    1.获取数据 #定义所需要的数据 gafataDict={"谷歌":"GOOG","亚马逊":"AMZN"," ...

  6. python爬虫 ip代理_Python 爬虫入门(二)—— IP代理使用

    上一节,大概讲述了Python 爬虫的编写流程, 从这节开始主要解决如何突破在爬取的过程中限制.比如,IP.JS.验证码等.这节主要讲利用IP代理突破. 1.关于代理 简单的说,代理就是换个身份.网络 ...

  7. python树的实现_Python实现简单字典树的方法

    本文实例讲述了Python实现简单字典树的方法.分享给大家供大家参考,具体如下: #coding=utf8 """代码实现了最简单的字典树,只支持由小写字母组成的字符串. ...

  8. python搭建web服务器_Python搭建简单的web服务器

    Python搭建简单的web服务器 1.win+R输入cmd打开命令行 2.通过 cd 进入到你保存 HTML 文件的目录.例如:H:\D3\d3 输入 cd\ 指令进入到C盘的根目录.(CD(更改目 ...

  9. python模拟抛硬币_python实现简单随机模拟——抛呀抛硬币

    还是在上次提到的数据之魅那本书,看到模拟这章,有个python模拟脚本,但书上不全,就自己简单写了下. 流程:在不同的平衡参数p(为0.5时为均匀的)下,模拟60次实验,每次投硬币8次,统计正面朝上的 ...

最新文章

  1. Unity与C#创建一个3D平台游戏 Learn to Create a 3D Platformer Game with Unity C#
  2. 基于模型(Model-based)进行特征选择(feature selection)并可视化特征重要性(feature importance)
  3. Go 两种形式的“类型转换”
  4. Linux 入门学习-LINUX基本认识及常用命令
  5. bool类型返回值_Python语法基础:高级变量类型
  6. android面试题2019中高级,2019Android 最新面试题 持续更新
  7. ANDROID开发中注意不同手机CPU架构对SO文件的不同需求。
  8. 如何判断一个进程已经完成初始化?
  9. 微服务架构实战篇(二):Spring boot2.0 + Swagger2 让你的API可视化
  10. HyperLPR车牌识别库代码分析(11)
  11. 校招行测笔试-图形推理
  12. 数据分析|基础概念/excel/tableau自学笔记
  13. windows server 2012 DHCP
  14. 软件测试 (4)Linux命令
  15. 开源公告|更可信的人脸识别,腾讯优图TFace正式开源!
  16. 送给正在 奋斗和成长路上的女人们
  17. 高中计算机 数制 教案,1.2.2 二进制与数制转换
  18. 【RL从入门到放弃】【二 表格型RL】
  19. agv系统介绍_AGV小车控制系统介绍
  20. MySQL——连接查询

热门文章

  1. c++ 解析eps文件
  2. 神仙道装备材料及掉落地点大全
  3. Python POST 爬虫爬取掘金用户信息
  4. mre应用和Native的交互之消息传递
  5. 微信官方:“清粉”别用了!
  6. 解决修改JAVAHOME后java版本不改变问题
  7. 安卓大屏导航可用万年历
  8. JavaScript实现恺撒密码加密/解密
  9. 【大一立项】如何亲手搭建ROS小车:硬件和软件介绍
  10. html avatar属性,动画混合问题,Avatar动画混合报错.