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中使用logging模块代替print(logging简明指南)
Jul 09 Python
Python实现处理管道的方法
Jun 04 Python
详解Django中Request对象的相关用法
Jul 17 Python
详解python 拆包可迭代数据如tuple, list
Dec 29 Python
Django实现表单验证
Sep 08 Python
Mac安装python3的方法步骤
Aug 09 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
python使用建议与技巧分享(一)
Aug 17 Python
Python用Jira库来操作Jira
Dec 28 Python
python中print格式化输出的问题
Apr 16 Python
python状态机transitions库详解
Jun 02 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
php常用的安全过滤函数集锦
2014/10/09 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
一个CSS+jQuery实现的放大缩小动画效果
2014/02/19 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
python 字符串常用函数详解
2019/09/11 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
python和php哪个容易学
2020/06/19 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
石油工程专业毕业生求职信
2014/04/13 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
先进个人评语大全
2015/01/04 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL
JAVA springCloud项目搭建流程
2022/05/11 Java/Android