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与shell的3种交互方式介绍
Apr 11 Python
python 打印对象的所有属性值的方法
Sep 11 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
神经网络(BP)算法Python实现及应用
Apr 16 Python
Python实现获取邮箱内容并解析的方法示例
Jun 16 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
python tkinter控件布局项目实例
Nov 04 Python
python的range和linspace使用详解
Nov 27 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
python字符串判断密码强弱
Mar 18 Python
pycharm部署django项目到云服务器的详细流程
Jun 29 Python
python flappy bird小游戏分步实现流程
Feb 15 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获取MAC地址的函数代码
2011/09/11 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
xtree.js 代码
2007/03/13 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
ReactNative中使用Redux架构总结
2017/12/15 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
远程教育心得体会
2014/01/03 职场文书
播音主持专业个人自我评价
2014/01/09 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
法定授权委托证明书
2014/09/27 职场文书
委托证明范本
2014/11/25 职场文书
作息时间调整通知
2015/04/22 职场文书
学校社团活动总结
2015/05/07 职场文书
酒店温馨提示语
2015/07/14 职场文书