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 相关文章推荐
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
详解Django中间件执行顺序
Jul 16 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
Jan 23 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
python并发编程多进程 模拟抢票实现过程
Aug 20 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
基于Python的OCR实现示例
Apr 03 Python
windows上彻底删除jupyter notebook的实现
Apr 13 Python
从0到1使用python开发一个半自动答题小程序的实现
May 12 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 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
图书管理程序(三)
2006/10/09 PHP
PHP 身份验证方面的函数
2009/10/11 PHP
PHP操作数组相关函数
2011/02/03 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
四个常见html网页乱码问题及解决办法
2015/09/08 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
Python实现的一个简单LRU cache
2014/09/26 Python
python实现备份目录的方法
2015/08/03 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
python查看模块,对象的函数方法
2018/10/16 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
简单了解python反射机制的一些知识
2019/07/13 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
会计专业自荐信
2013/12/02 职场文书
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
交通事故和解协议书
2015/01/27 职场文书
财政局个人总结
2015/03/04 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
八年级作文之友谊
2019/12/02 职场文书
用JS实现飞机大战小游戏
2021/06/09 Javascript
Hive日期格式转换方法总结
2022/06/25 数据库