计算机网络课程设计之网络代理服务器的设计与实现
前言
本實驗因為時間有限,寫的比較草率。。。
白嫖容易,創作不易,本文原創,轉載請注明!!!
源碼和可運行程序:
鏈接: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
當完成請求的接收數據的時候,會觸發槽函數,然后就可以處理數據,處理數據如下:
//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=
總結
以上是生活随笔為你收集整理的计算机网络课程设计之网络代理服务器的设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 字符串转查找_Java 实例
- 下一篇: python xlrd_python读取