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实现的简单发送邮件脚本分享
Nov 07 Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 Python
python django事务transaction源码分析详解
Mar 17 Python
用python实现的线程池实例代码
Jan 06 Python
pycharm的console输入实现换行的方法
Jan 16 Python
django 通过URL访问上传的文件方法
Jul 28 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
python实现用类读取文件数据并计算矩形面积
Jan 18 Python
Django调用百度AI接口实现人脸注册登录代码实例
Apr 23 Python
django orm模块中的 is_delete用法
May 20 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 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 实例化类的一点摘记
2008/03/23 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
js 判断脚本加载完毕的代码
2011/07/13 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
js实现数字滚动特效
2019/12/16 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
python中的装饰器详解
2015/04/13 Python
python for循环remove同一个list过程解析
2019/08/14 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
Python如何执行系统命令
2020/09/23 Python
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
应届生英语教师求职信
2013/11/05 职场文书
中国好声音华少广告词
2014/03/17 职场文书
干部考核评语
2014/04/29 职场文书
公司自我介绍演讲稿
2014/08/21 职场文书
2014年导购员工作总结
2014/11/18 职场文书
施工安全员岗位职责
2015/04/11 职场文书
2015年检验科工作总结
2015/04/27 职场文书
中小企业员工手册范本
2015/05/14 职场文书
赢在执行观后感
2015/06/16 职场文书
三八妇女节新闻稿
2015/07/17 职场文书
golang正则之命名分组方式
2021/04/25 Golang
分析Python list操作为什么会错误
2021/11/17 Python