前言

本实验因为时间有限,写的比较草率。。。

白嫖容易,创作不易,本文原创,转载请注明!!!
源码和可运行程序:
链接:https://pan.baidu.com/s/1A9KctmpP2JJgyW2wLrehIg
提取码:Lin2

计算机网络课程设计:
计算机网络课程设计之网络聊天程序的设计与实现
计算机网络课程设计之Tracert与Ping程序设计与实现
计算机网络课程设计之基于 IP 多播的网络会议程序
计算机网络课程设计之网络嗅探器的设计与实现
计算机网络课程设计之电子邮件客户端程序设计与实现
计算机网络课程设计之TELNET 终端设计与实现
计算机网络课程设计之网络代理服务器的设计与实现
计算机网络课程设计之简单 Web Server 程序的设计与实现

Qt入门系列:
Qt学习之C++基础
Qt学习之Qt安装
Qt学习之Qt基础入门(上)
Qt学习之Qt基础入门(中)
Qt学习之Qt基础入门(下)

创作不易,整个课程设计程序3000多行代码,所有实验都写在了一个程序中,时间有限,能力不足,转载望注明!!!
本文链接
个人博客:https://ronglin.fun/archives/276
PDF链接:见博客网站
CSDN: https://blog.csdn.net/RongLin02/article/details/122510609

实验题目

网络代理服务器的设计与实现

实验目的

实现一个简易的 proxy 程序。proxy 程序的功能:能够做“二传手”的工作。它自身处在能同时连通外界目标服务器和我的机器的位置上。我的机器把请求发送给它,它接受请求,把请求原封不动的抄下来发送给外界目标服务器;外界目标服务器响应了请求,把回答发送给它,它再接受回答,把回答原封不动的抄下来发送给我的机器。这样,我的机器实际上是把它当作了目标服务器(由于是原封不动的转抄,请求和回答没有被修改)。而它则是外界目标服务器的客户端。

总体设计

(含背景知识或基本原理与算法、或模块介绍、设计步骤等)
一共想了三种实现方法
第一种:
这种最简单,这个Proxy的设计思路为写一个proxy客户端和一个proxy服务器,客户端和服务器用TCP连接,然后客户端将要请求的网站发给服务器,然后服务器发出一个HTTP/HTTPS请求,然后将请求的返回数据再通过TCP把数据发送给proxy客户端。这种思路有一个问题就是当关闭代理的时候,proxy客户端是没有办法发出请求的
第二种:
这种思路是在思路一的基础上,给客户端增加一个判断,如果连接了proxy服务器的时候,就把网站发送给proxy服务器,如果没有连接proxy服务器的话,就自己发出一个HTTP/HTTPS请求,然后处理接受的数据,这种是最符合proxy代理的展示作用的
第三种:
这种思路是前两者的增强版,因为前两者只是用来展示作用,实际上是没啥实际作用的,我想的第三种思路是,当启动proxy服务器的时候,监听客户端发出的所有请求,作为一个中介,然后拦截下来,分析请求头,然后重新构造一个请求发出,然后把返回结果通过TCP返还给proxy客户端

详细设计

(含主要的数据结构、程序流程图、关键代码等)
时间有限,决定用第一种思路
难点主要在于Qt发出一个HTTP/HTTPS请求,HTTP简单,但是HTTPS比较麻烦,下面说明一下Qt如何发出一个HTTP/HTTPS请求
参考博客:
https://blog.csdn.net/gongjianbo1992/article/details/97568863

//构建一个manager对象
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
//manager具有异步API,当http请求完成后,会通过finished信号进行通知
connect(manager,&QNetworkAccessManager::finished,this,&MyClass::replyFinished);
//发送异步get请求
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

当完成请求的接收数据的时候,会触发槽函数,然后就可以处理数据,处理数据如下:

//connect(manager,&QNetworkAccessManager::finished,this,&MyClass::replyFinished);
//槽函数
void MyClass::replyFinished(QNetworkReply *reply)
{if(reply->error()!=QNetworkReply::NoError){//处理中的错误信息qDebug()<<"reply error:"<<reply->errorString();}else{//请求方式qDebug()<<"operation:"<<reply->operation();//状态码qDebug()<<"status code:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();qDebug()<<"url:"<<reply->url();//qDebug()<<"raw header:"<<reply->rawHeaderList();//获取响应信息const QByteArray reply_data=reply->readAll();qDebug()<<"read all:"<<reply_data;}reply->deleteLater();
}

然后完成了一次HTTP请求

对于HTTPS的请求

首先要先获取需要的OpenSSL版本

    bool bSupp = QSslSocket::supportsSsl();QString buildVersion = QSslSocket::sslLibraryBuildVersionString();QString version = QSslSocket::sslLibraryVersionString();
//    true "OpenSSL 1.0.2j  26 Sep 2016" "OpenSSL 1.0.2f  28 Jan 2016"
//    qDebug() << bSupp << buildVersion << version << endl;

我这里输出

true "OpenSSL 1.0.2j  26 Sep 2016" "OpenSSL 1.0.2f  28 Jan 2016"

说明需要的是OpenSSL 1.0.2j的版本,然后去搜索,下载好两个文件放在exe同级文件夹下即可

    // 发送https请求前准备工作;QSslConfiguration config;QSslConfiguration conf = request.sslConfiguration();conf.setPeerVerifyMode(QSslSocket::VerifyNone);conf.setProtocol(QSsl::AnyProtocol);request.setSslConfiguration(conf);request.setUrl(QUrl(URL));manager->get(request);

然后配置好即可

实验结果与分析

界面如下

先启动proxy服务器,然后登录,然后点击请求

然后请求成功,发现请求的百度的数据已经返回回来了。

小结与心得体会

时间仓促,没有写的很好,只是为了实现演示而设计功能,不过对于proxy有了了解。
=w=

计算机网络课程设计之网络代理服务器的设计与实现相关推荐

  1. 计算机网络课程设计之网络嗅探器的设计与实现

    前言 本实验难点是在于Windows下的raw socket有太多的限制,因此用winpcap编程功能更加强大,但是根据指导书要求要用原始套接字,原始套接字在Linux系统下也十分强大,结尾附上Lin ...

  2. 7、网络代理服务器的设计与实现

    一.设计题目 7.网络代理服务器的设计与实现 二.设计内容 实现一个简易的 proxy 程序.proxy 程序的功能:能够做"二传手"的工作.它自身处在能同时连通外界目标服务器和我 ...

  3. 网络代理服务器的设计与实现

    功能需求 实现一个简易的 proxy 程序.proxy 程序的功能:能够做"二传手"的工作.它自身处在能同时连通外界目标服务器和我的机器的位置上.我的机器把请求发送给它,它接受请求 ...

  4. 计算机网络实验1:HTTP 代理服务器的设计与实现

    目录 一.修改并理解参考代码 1.修改错误 2.基本代理服务器原理 二.附加功能的实现 1.网站过滤:允许/不允许访问某些网站 2.用户过滤:支持/不支持某些用户访问外部网站 3.网站引导:将用户对某 ...

  5. 计算机网络课程设计之基于 IP 多播的网络会议程序

    前言 本实验难点在于环境的配置,尤其是多网卡配置,经过查阅资料和多次小伙伴们测试,最后终于找到问题的根源 问题分析和配置主要放在实验结果与分析栏中 结尾附上指导书的IP多播源码 白嫖容易,创作不易,本 ...

  6. 计算机网络课程设计之网络聊天程序的设计与实现

    前言 计算机网络课程设计开始,要求用C/C++,而且有些题目还要有图形界面,因此决定用Qt写图形界面,同时决定用一个程序完成所有的实验设计. 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运 ...

  7. 计算机网络课程设计之简单 Web Server 程序的设计与实现

    前言 本实验是实现一个简易的webserver,我们一直在访问网站,甚至还做过Web课程设计,部署过Tomcat等等,所以说这次实验能更深入的了解其原理 白嫖容易,创作不易,本文原创,转载请注明!!! ...

  8. 计算机网络课程设计之TELNET 终端设计与实现

    前言 Telnet设计是一个比较麻烦的东东,因为Telnet服务器需要部署,而且网络上的资料比较少,最后通过在云服务器CentOS上安装Telnet服务器然后自己的程序作为一个Telnet客户端测试成 ...

  9. 计算机网络课程设计之电子邮件客户端程序设计与实现

    前言 本实验主要是用smtp协议发邮件,收邮件要用到POP3,时间有限,只实现了发邮件,实现过程放在总体设计中 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运行程序: 链接:https:/ ...

最新文章

  1. pandas学习之Series结构
  2. 实现困境突破:中小企业家的三项修炼
  3. 参考文献 如何控制别自动换行_word里插入参考文献时,出现自动换行,排版很难看,怎么解决?有图!求大神指教!...
  4. soap协议_Go和SOAP
  5. c语言无符号中符号什么意思,C语言中无符号与有符号及相加问题
  6. Express app.get 进行路由 Route 设置
  7. 欢迎使用CSDN-markdown编辑器7-3
  8. 两种方法查看MFC源代码
  9. 关于Google Guava的几个问题
  10. 【Flutter】Dart的工厂构造方法单例对象初始化列表
  11. linux socket版本 can,linux socket can程序cantool
  12. VIX 指数构造详细证明过程
  13. 中国冰淇淋市场深度评估及发展趋势预测报告(2022版)
  14. qurlinfo在qt5中_QT5编译使用QFtp的方法步骤
  15. 递归和动态规划的一个区别(递归是自顶向下,然后返回计算;动态规划是自低向上运算)
  16. 中国腹肌刺激器行业发展动态与投资前景预测报告(2022-2027)
  17. python元组切片_Python中如何对元组进行切片
  18. (小)算法题(长期更新)
  19. python连接打印机打印收据单_使用python打印收据
  20. Python Django框架的安装及基本用法

热门文章

  1. Nginx伪静态配置和常用Rewrite伪静态规则集锦
  2. monkey 环境搭建
  3. 关于telnet: connect to address 190.168.6.6: No route to host 报错处理
  4. Eclipse+PyDev 安装和配置(转)
  5. codeblocks下libcurl的配置
  6. Android 向服务器发送XML数据及调用webservice
  7. 非985,计算机专业的大学生该如何自学编程?
  8. Debian Linux下如何以root账号登录桌面
  9. 如何用FineReport制作一张报表(一)
  10. 在mount里看到哪个设备文件的一些笔记