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制作简单的钢琴程序的教程
Apr 01 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
Nov 30 Python
利用python将xml文件解析成html文件的实现方法
Dec 22 Python
python字符串和常用数据结构知识总结
May 21 Python
Django后端接收嵌套Json数据及解析详解
Jul 17 Python
详解python statistics模块及函数用法
Oct 27 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
pycharm双击无响应(打不开问题解决办法)
Jan 10 Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
详解python中groupby函数通俗易懂
May 14 Python
Python切片列表字符串如何实现切换
Aug 06 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实现快钱支付功能(涉及到接口)
2013/07/01 PHP
php生成动态验证码gif图片
2015/10/19 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
JS解决url传值出现中文乱码的另类办法
2013/04/08 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
python实现感知器算法详解
2017/12/19 Python
java判断三位数的实例讲解
2019/06/10 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
为什么要有struct关键字
2012/05/08 面试题
土木工程实习生自我鉴定
2013/09/19 职场文书
软件售后服务方案
2014/05/29 职场文书
员工安全责任书范本
2014/07/24 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
物流管理专业推荐信
2014/09/06 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
专职安全员岗位职责
2015/04/11 职场文书
2016年敬老月活动总结
2016/04/05 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python
Python可视化学习之seaborn调色盘
2022/02/24 Python
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle