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的ORM框架SQLAlchemy入门教程
Apr 28 Python
python使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
Python中关于使用模块的基础知识
May 24 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
Jul 08 Python
使用pyecharts在jupyter notebook上绘图
Apr 23 Python
python通过socket实现多个连接并实现ssh功能详解
Nov 08 Python
Python编程argparse入门浅析
Feb 07 Python
python删除服务器文件代码示例
Feb 09 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
linux环境下Django的安装配置详解
Jul 22 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
利用python做表格数据处理
Apr 13 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使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
js DataSet数据源处理代码
2010/03/29 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
JavaScript中使用document.write向页面输出内容实例
2014/10/16 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
JQuery选择器、过滤器大整理
2015/05/26 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
Vue自定义指令详解
2017/07/28 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
Python线程中对join方法的运用的教程
2015/04/09 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
Python计算IV值的示例讲解
2020/02/28 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
用python读取xlsx文件
2020/12/17 Python
高三毕业生自我鉴定
2013/12/20 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
推荐信范文大全
2015/03/27 职场文书
火烧圆明园观后感
2015/06/03 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL