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利用elaphe制作二维条形码实现代码
May 25 Python
python多重继承实例
Oct 11 Python
python使用装饰器和线程限制函数执行时间的方法
Apr 18 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
Django工程的分层结构详解
Jul 18 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
Dec 10 Python
django序列化serializers过程解析
Dec 14 Python
Python实现图片识别加翻译功能
Dec 26 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
Feb 23 Python
jupyter notebook 多行输出实例
Apr 09 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
python_tkinter事件类型详情
Mar 20 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精度计算的问题解析
2019/06/21 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
无阻塞加载脚本分析[全]
2011/01/20 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
javascript常用功能汇总
2015/07/05 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
Python的SQLalchemy模块连接与操作MySQL的基础示例
2016/07/11 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
使用matplotlib画散点图的方法
2018/05/25 Python
Python清空文件并替换内容的实例
2018/10/22 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
python Django 创建应用过程图示详解
2019/07/29 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
Python自动化之UnitTest框架实战记录
2020/09/08 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
flask项目集成swagger的方法
2020/12/09 Python
50个强大璀璨的CSS3/JS技术运用实例
2010/02/27 HTML / CSS
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
Java的类与C++的类有什么不同
2014/01/18 面试题
应届生会计电算化求职信
2013/10/03 职场文书
影视制作岗位职责
2013/12/04 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP