计算机网络课程设计之网络代理服务器的设计与实现
前言
本實(shí)驗(yàn)因?yàn)闀r(shí)間有限,寫(xiě)的比較草率。。。
白嫖容易,創(chuàng)作不易,本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明!!!
源碼和可運(yùn)行程序:
鏈接:https://pan.baidu.com/s/1A9KctmpP2JJgyW2wLrehIg
提取碼:Lin2
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì):
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之網(wǎng)絡(luò)聊天程序的設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之Tracert與Ping程序設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之基于 IP 多播的網(wǎng)絡(luò)會(huì)議程序
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之網(wǎng)絡(luò)嗅探器的設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之電子郵件客戶端程序設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之TELNET 終端設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之網(wǎng)絡(luò)代理服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之簡(jiǎn)單 Web Server 程序的設(shè)計(jì)與實(shí)現(xiàn)
Qt入門(mén)系列:
Qt學(xué)習(xí)之C++基礎(chǔ)
Qt學(xué)習(xí)之Qt安裝
Qt學(xué)習(xí)之Qt基礎(chǔ)入門(mén)(上)
Qt學(xué)習(xí)之Qt基礎(chǔ)入門(mén)(中)
Qt學(xué)習(xí)之Qt基礎(chǔ)入門(mén)(下)
創(chuàng)作不易,整個(gè)課程設(shè)計(jì)程序3000多行代碼,所有實(shí)驗(yàn)都寫(xiě)在了一個(gè)程序中,時(shí)間有限,能力不足,轉(zhuǎn)載望注明!!!
本文鏈接
個(gè)人博客:https://ronglin.fun/archives/276
PDF鏈接:見(jiàn)博客網(wǎng)站
CSDN: https://blog.csdn.net/RongLin02/article/details/122510609
實(shí)驗(yàn)題目
網(wǎng)絡(luò)代理服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)
實(shí)驗(yàn)?zāi)康?/h1>
實(shí)現(xiàn)一個(gè)簡(jiǎn)易的 proxy 程序。proxy 程序的功能:能夠做“二傳手”的工作。它自身處在能同時(shí)連通外界目標(biāo)服務(wù)器和我的機(jī)器的位置上。我的機(jī)器把請(qǐng)求發(fā)送給它,它接受請(qǐng)求,把請(qǐng)求原封不動(dòng)的抄下來(lái)發(fā)送給外界目標(biāo)服務(wù)器;外界目標(biāo)服務(wù)器響應(yīng)了請(qǐng)求,把回答發(fā)送給它,它再接受回答,把回答原封不動(dòng)的抄下來(lái)發(fā)送給我的機(jī)器。這樣,我的機(jī)器實(shí)際上是把它當(dāng)作了目標(biāo)服務(wù)器(由于是原封不動(dòng)的轉(zhuǎn)抄,請(qǐng)求和回答沒(méi)有被修改)。而它則是外界目標(biāo)服務(wù)器的客戶端。
總體設(shè)計(jì)
(含背景知識(shí)或基本原理與算法、或模塊介紹、設(shè)計(jì)步驟等)
一共想了三種實(shí)現(xiàn)方法
第一種:
這種最簡(jiǎn)單,這個(gè)Proxy的設(shè)計(jì)思路為寫(xiě)一個(gè)proxy客戶端和一個(gè)proxy服務(wù)器,客戶端和服務(wù)器用TCP連接,然后客戶端將要請(qǐng)求的網(wǎng)站發(fā)給服務(wù)器,然后服務(wù)器發(fā)出一個(gè)HTTP/HTTPS請(qǐng)求,然后將請(qǐng)求的返回?cái)?shù)據(jù)再通過(guò)TCP把數(shù)據(jù)發(fā)送給proxy客戶端。這種思路有一個(gè)問(wèn)題就是當(dāng)關(guān)閉代理的時(shí)候,proxy客戶端是沒(méi)有辦法發(fā)出請(qǐng)求的
第二種:
這種思路是在思路一的基礎(chǔ)上,給客戶端增加一個(gè)判斷,如果連接了proxy服務(wù)器的時(shí)候,就把網(wǎng)站發(fā)送給proxy服務(wù)器,如果沒(méi)有連接proxy服務(wù)器的話,就自己發(fā)出一個(gè)HTTP/HTTPS請(qǐng)求,然后處理接受的數(shù)據(jù),這種是最符合proxy代理的展示作用的
第三種:
這種思路是前兩者的增強(qiáng)版,因?yàn)榍皟烧咧皇怯脕?lái)展示作用,實(shí)際上是沒(méi)啥實(shí)際作用的,我想的第三種思路是,當(dāng)啟動(dòng)proxy服務(wù)器的時(shí)候,監(jiān)聽(tīng)客戶端發(fā)出的所有請(qǐng)求,作為一個(gè)中介,然后攔截下來(lái),分析請(qǐng)求頭,然后重新構(gòu)造一個(gè)請(qǐng)求發(fā)出,然后把返回結(jié)果通過(guò)TCP返還給proxy客戶端
詳細(xì)設(shè)計(jì)
(含主要的數(shù)據(jù)結(jié)構(gòu)、程序流程圖、關(guān)鍵代碼等)
時(shí)間有限,決定用第一種思路
難點(diǎn)主要在于Qt發(fā)出一個(gè)HTTP/HTTPS請(qǐng)求,HTTP簡(jiǎn)單,但是HTTPS比較麻煩,下面說(shuō)明一下Qt如何發(fā)出一個(gè)HTTP/HTTPS請(qǐng)求
參考博客:
https://blog.csdn.net/gongjianbo1992/article/details/97568863
當(dāng)完成請(qǐng)求的接收數(shù)據(jù)的時(shí)候,會(huì)觸發(fā)槽函數(shù),然后就可以處理數(shù)據(jù),處理數(shù)據(jù)如下:
//connect(manager,&QNetworkAccessManager::finished,this,&MyClass::replyFinished); //槽函數(shù) void MyClass::replyFinished(QNetworkReply *reply) {if(reply->error()!=QNetworkReply::NoError){//處理中的錯(cuò)誤信息qDebug()<<"reply error:"<<reply->errorString();}else{//請(qǐng)求方式qDebug()<<"operation:"<<reply->operation();//狀態(tài)碼qDebug()<<"status code:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();qDebug()<<"url:"<<reply->url();//qDebug()<<"raw header:"<<reply->rawHeaderList();//獲取響應(yīng)信息const QByteArray reply_data=reply->readAll();qDebug()<<"read all:"<<reply_data;}reply->deleteLater(); }然后完成了一次HTTP請(qǐng)求
對(duì)于HTTPS的請(qǐng)求
首先要先獲取需要的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"說(shuō)明需要的是OpenSSL 1.0.2j的版本,然后去搜索,下載好兩個(gè)文件放在exe同級(jí)文件夾下即可
// 發(fā)送https請(qǐng)求前準(zhǔn)備工作;QSslConfiguration config;QSslConfiguration conf = request.sslConfiguration();conf.setPeerVerifyMode(QSslSocket::VerifyNone);conf.setProtocol(QSsl::AnyProtocol);request.setSslConfiguration(conf);request.setUrl(QUrl(URL));manager->get(request);然后配置好即可
實(shí)驗(yàn)結(jié)果與分析
界面如下
先啟動(dòng)proxy服務(wù)器,然后登錄,然后點(diǎn)擊請(qǐng)求
然后請(qǐng)求成功,發(fā)現(xiàn)請(qǐng)求的百度的數(shù)據(jù)已經(jīng)返回回來(lái)了。
小結(jié)與心得體會(huì)
時(shí)間倉(cāng)促,沒(méi)有寫(xiě)的很好,只是為了實(shí)現(xiàn)演示而設(shè)計(jì)功能,不過(guò)對(duì)于proxy有了了解。
=w=
總結(jié)
以上是生活随笔為你收集整理的计算机网络课程设计之网络代理服务器的设计与实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 字符串转查找_Java 实例
- 下一篇: python xlrd_python读取