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 相关文章推荐
天翼开放平台免费短信验证码接口使用实例
Dec 18 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
Python中join函数简单代码示例
Jan 09 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
Python+OpenCV实现将图像转换为二进制格式
Jan 09 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
pytorch实现Tensor变量之间的转换
Feb 17 Python
Python是什么 Python的用处
May 26 Python
Python如何脚本过滤文件中的注释
May 27 Python
opencv 图像轮廓的实现示例
Jul 08 Python
Flask搭建一个API服务器的步骤
May 28 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 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 显示客户端IP与服务器IP的代码
2010/10/12 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
php扩展开发入门demo示例
2019/09/23 PHP
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
jquery使用经验小结
2015/05/20 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
2018/11/30 Javascript
JavaScript中的&quot;=、==、===&quot;区别讲解
2019/01/22 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
Python操作MongoDB详解及实例
2017/05/18 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
html5 web本地存储将取代我们的cookie
2012/12/26 HTML / CSS
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
自我评价格式
2014/01/06 职场文书
一年级学生评语
2014/04/23 职场文书
理想演讲稿范文
2014/05/21 职场文书
房地产端午节活动方案
2014/08/24 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
预备党员群众意见
2015/06/01 职场文书
党课主持词大全
2015/06/30 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL