Python简单实现的代理服务器端口映射功能示例


Posted in Python onApril 08, 2018

本文实例讲述了Python简单实现的代理服务器端口映射功能。分享给大家供大家参考,具体如下:

一 代码

1、模拟服务端代码

import sys
import socket
import threading
#回复消息,原样返回
def replyMessage(conn):
  while True:
    data = conn.recv(1024)
    conn.send(data)
    if data.decode().lower() == 'bye':
      break
  conn.close()
def main():
  sockScr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  sockScr.bind(('', port))
  sockScr.listen(200)
  while True:
    try:
      conn, addr = sockScr.accept()
      #只允许特定主机访问本服务器
      if addr[0] != onlyYou:
        conn.close()
        continue
      #创建并启动线程
      t = threading.Thread(target=replyMessage, args=(conn,))
      t.start()
    except:
      print('error')
if __name__ == '__main__':
  try:
    #获取命令行参数
    port = int(sys.argv[1])
    onlyYou = sys.argv[2]
    main()
  except:
    print('Must give me a number as port')

2、模拟代理服务器代码

import sys
import socket
import threading
def middle(conn, addr):
  #面向服务器的Socket
  sockDst = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  sockDst.connect((ipServer,portServer))
  while True:
    data = conn.recv(1024).decode()
    print('收到客户端消息:'+data)
    if data == '不要发给服务器':
      conn.send('该消息已被代理服务器过滤'.encode())
      print('该消息已过滤')
    elif data.lower() == 'bye':
      print(str(addr)+'客户端关闭连接')
      break
    else:
      sockDst.send(data.encode())
      print('已转发服务器')
      data_fromServer = sockDst.recv(1024).decode()
      print('收到服务器回复的消息:'+data_fromServer)
      if data_fromServer == '不要发给客户端':
        conn.send('该消息已被代理服务器修改'.encode())
        print('消息已被篡改')
      else:
        conn.send(b'Server reply:'+data_fromServer.encode())
        print('已转发服务器消息给客户端')
  conn.close()
  sockDst.close()
def main():
  sockScr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  sockScr.bind(('', portScr))
  sockScr.listen(200)
  print('代理已启动')
  while True:
    try:
      conn, addr = sockScr.accept()
      t = threading.Thread(target=middle, args=(conn, addr))
      t.start()
      print('新客户:'+str(addr))
    except:
      pass
if __name__ == '__main__':
  try:
    #(本机IP地址,portScr)<==>(ipServer,portServer)
    #代理服务器监听端口
    portScr = int(sys.argv[1])
    #服务器IP地址与端口号
    ipServer = sys.argv[2]
    portServer = int(sys.argv[3])
    main()
  except:
    print('Sth error')

3、模拟客户端代码

import sys
import socket
def main():
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  sock.connect((ip, port))
  while True:
    data = input('What do you want to ask:')
    sock.send(data.encode())
    print(sock.recv(1024).decode())
    if data.lower() == 'bye':
      break
  sock.close()
if __name__ == '__main__':
  try:
    #代理服务器的IP地址和端口号
    ip = sys.argv[1]
    port = int(sys.argv[2])
    main()
  except:
    print('Sth error')

二 运行结果

Python简单实现的代理服务器端口映射功能示例

三 运行说明

从结果可以看出,代理服务器代码能够对客户端和服务器之间的内容进行记录,也能够修改双方通信内容,这样实际存在潜在危险。只要代理服务想这样做,客户在网络上的通信就没有什么隐私可言了,因此如果涉及金钱交易,最好不要使用代理服务器。

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

Python 相关文章推荐
Python解析xml中dom元素的方法
Mar 12 Python
Python数字图像处理之霍夫线变换实现详解
Jan 12 Python
Python打印“菱形”星号代码方法
Feb 05 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
Python使用Phantomjs截屏网页的方法
May 17 Python
django开发post接口简单案例,获取参数值的方法
Dec 11 Python
python列表推导式入门学习解析
Dec 02 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 Python
python对文件的操作方法汇总
Feb 28 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
python如何为list实现find方法
May 30 Python
pandas修改DataFrame列名的方法
Apr 08 #Python
Python数据分析库pandas基本操作方法
Apr 08 #Python
浅谈pandas中shift和diff函数关系
Apr 08 #Python
使用DataFrame删除行和列的实例讲解
Apr 08 #Python
将字典转换为DataFrame并进行频次统计的方法
Apr 08 #Python
pandas创建新Dataframe并添加多行的实例
Apr 08 #Python
DataFrame中去除指定列为空的行方法
Apr 08 #Python
You might like
URL Rewrite的设置方法
2007/01/02 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
微信小程序之picker日期和时间选择器
2017/02/09 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python结合API实现即时天气信息
2016/01/19 Python
python 生成器协程运算实例
2017/09/04 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
Python数据集切分实例
2018/12/08 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
const和static readonly区别
2013/05/20 面试题
公务员转正考察材料
2014/02/07 职场文书
劲霸男装广告词
2014/03/21 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript