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中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
python实现朴素贝叶斯分类器
Mar 28 Python
Python图像处理之简单画板实现方法示例
Aug 30 Python
详解用python写一个抽奖程序
May 10 Python
python3的print()函数的用法图文讲解
Jul 16 Python
Python从文件中读取指定的行以及在文件指定位置写入
Sep 06 Python
python微信公众号开发简单流程实现
Mar 09 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
Python中常见的数制转换有哪些
May 27 Python
详解Django中的FBV和CBV对比分析
Mar 01 Python
关于Numpy之repeat、tile的用法总结
Jun 02 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 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中上传大体积文件时需要的设置
2006/10/09 PHP
php获取远程文件大小
2015/10/20 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
解决npm安装Electron缓慢网络超时导致失败的问题
2018/02/06 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
Python实现比较两个列表(list)范围
2015/06/12 Python
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
Python中线程编程之threading模块的使用详解
2015/06/23 Python
Python MySQL数据库连接池组件pymysqlpool详解
2017/07/07 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
python中threading开启关闭线程操作
2020/05/02 Python
如何将json数据转换为python数据
2020/09/04 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
numpy实现RNN原理实现
2021/03/02 Python
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
内容编辑个人求职信
2013/12/10 职场文书
小学教师管理制度
2014/01/18 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
运动会开幕词
2015/01/28 职场文书
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python
vue实力踩坑之push当前页无效
2022/04/10 Vue.js