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中logging库的使用总结
Oct 18 Python
使用python实现链表操作
Jan 26 Python
Python中if elif else及缩进的使用简述
May 31 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
python树莓派红外反射传感器
Jan 21 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
python根据时间获取周数代码实例
Sep 30 Python
Python求解排列中的逆序数个数实例
May 03 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
MATLAB数学建模之画图汇总
Jul 16 Python
分享几种python 变量合并方法
Mar 20 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
推荐十款免费 WordPress 插件
2015/03/24 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
JQuery 入门实例1
2009/06/25 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
浅谈JavaScript中null和undefined
2015/07/09 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
python多线程socket编程之多客户端接入
2017/09/12 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
2019/05/10 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
DataReader和DataSet的异同
2014/12/31 面试题
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
24岁生日感言
2014/01/13 职场文书
农民致富事迹材料
2014/01/23 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
MySQL实战记录之如何快速定位慢SQL
2022/03/23 MySQL