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脚本帮你找出微信上删除你好友的人
Jan 07 Python
python设计模式大全
Jun 27 Python
Pycharm学习教程(2) 代码风格
May 02 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
python实现对文件中图片生成带标签的txt文件方法
Apr 27 Python
利用pandas将numpy数组导出生成excel的实例
Jun 14 Python
Python中psutil的介绍与用法
May 02 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
python对接ihuyi实现短信验证码发送
May 10 Python
如何学习Python time模块
Jun 03 Python
Python调用jar包方法实现过程解析
Aug 11 Python
Python一些基本的图像操作和处理总结
Jun 23 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/02/24 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
2016/03/05 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
百联网上商城:i百联
2017/01/28 全球购物
护士实习生自我鉴定范文
2013/12/10 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
党的群众路线教育实践活动个人整改措施范文
2014/11/04 职场文书
2014个人年度工作总结
2014/12/15 职场文书
考研英语复习计划
2015/01/19 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书