瀏覽器與服務器之間創建鏈接的過程
--------------------------------------------------------------------------------------------------
web瀏覽器與服務器之間的一次完整的http請求響應過程:
1.瀏覽器根據所使用的http協議,解析出對應的域名
2.經過DNS域名解析,查詢出對應的ip地址
3.經過url解析出對應的端口號,若是是80端口,默承認以省略
4.瀏覽器發起並創建到ip地址的80端口的鏈接 ----------------先獲得域名,經過域名獲得ip,再經過url獲得端口 ,以後發起tcp鏈接
5.瀏覽器向服務器發起get請求--------------------------------鏈接以後而後再發送get請求數據
6.服務器響應瀏覽器的請求,瀏覽器讀取響應,渲染網頁---------------------------服務器響應請求發送數據,瀏覽器接受到以後解析網頁
7.瀏覽器關閉與服務器的鏈接--------------數據傳送完畢斷開連接web
-----------------------------------------------------------------------------------------------------------
接下來對tcp鏈接作一些解釋:套接字,是支持TCP/IP的網絡通訊的基本操做單元,能夠看作是不一樣主機之間的進程進行雙向通訊的端點,簡單的說就是通訊的兩方的一種約定,用套接字中的相關函數來完成通訊過程。
至關於聯通網絡與程序代碼之間的接口
----------------------------------------------------------------------------------------------- Tcp的網絡鏈接的過程: 首先對於服務器: 1、服務器有兩個套接字:監聽套接字、通訊套接字(對於某些語言來講可能還要開啓套接字服務才能建立套接字) 2、監聽套接字分爲:建立套接字、bind綁定ip和端口、listen監聽外來鏈接(在bind綁定的以前還要進行鏈接地址的設置) 3、以後就是通訊套接字:accept創建鏈接 -----在qt小紅能夠用newconnection來表示有新的客戶端鏈接過來了
tcpSocket=tcpServer->nextPendingConnection(); -----------經過這個函數去取得通訊套接字
4、創建鏈接以後就開始進行,write,read發送和讀取信息 再來看看客戶端的: 1、一樣的建立套接字 2、發送connect鏈接請求(在發送connect以前還要設置要鏈接的服務器的地址信息)鏈接成功以後,qt會自動發出connected信號 3、請求成功以後再進行write、read發送和讀取信息 Qt==network 在qt中有個監聽 QT的槽函數,都是指針類型Lambda表達式 ---------》[=](){};=表示值傳遞,外部全部的局部變量,和類中的成員變量,值不能夠被修改 ---------》[&](){};=表示引用傳遞,外部全部的局部變量,值能夠被修改,引用若是被銷燬,則引用會報錯 ---------》通常用[=](){} QT中有一個對象樹:從QObject這個根開始一直往下走,只要對象在繼承的時候指定了父對象,那麼當程序結束的時候 QT就會從最開始的QObject去往下逐漸的去釋放資源 IP地址:一種數字化的地址方案:如:127.0.0.1 域名:一種符號化的地址方案:如:www.hstc.edn.cn DNS:在Internet上域名與IP地址之間是一對一(或者多對一)的,域名雖然便於人們記憶,但機器之間只能互相認識IP地址,它們之間的轉換工做稱爲域名解析,域名解析須要由專門的域名解析服務器來完成,DNS就是進行域名解析的服務器。域名的最終指向是IP URL:統一資源定位符(英語UniformResourceLocator的縮寫)俗稱爲網址,網址格式爲:<協議>://<域名或IP>:<端口>/<路徑>。<協議>://<域名或IP>是必需的,<端口>/<路徑>有時可省略。如:https://www.baidu.com/ 一個網站的URL是一個網站的一部分,是網站資源的一個子集(URI的子集),是指向網站資源的統必定位符 不少狀況下,URL都是在網址後面配上參數。也就是說網址一般是URL的上一級地址。如:https://blog.csdn.net/ParanoidYang/article/details/54288370 QT中的網絡通訊有: 服務器: QTcpServer //監聽套接字 QTcpScoket //通訊套接字 1、建立套接字後進行監聽------------------ 2、當有用戶鏈接的時候就會觸發newConnection 而且返回通訊套接字,而後就開始進行readyread tcpServer=new QTcpServer(this); tcpServer->listen(QHostAddress::Any,8888); connect(tcpServer,&QTcpServer::newConnection,[=](){ tcpSocket=tcpServer->nextPendingConnection(); QString ip=tcpSocket->peerAddress().toString(); qint16 port=tcpSocket->peerPort(); QString temp=QString("[%1:%2]:成功鏈接").arg(ip).arg(port); ui->textEditRead->setText(temp); connect(tcpSocket,&QTcpSocket::readyRead,[=](){ QByteArray array=tcpSocket->readAll(); ui->textEditRead->append(array); }); }); 發送消息: void Widget::on_pushButton_clicked() { if(tcpSocket==nullptr) { return; } //獲取編輯區的內容 QString str=ui->textEditWriter->toPlainText(); tcpSocket->write(str.toUtf8().data()); } 斷開鏈接: void Widget::on_pushButton_2_clicked() { if(tcpSocket==nullptr) { return; } tcpSocket->disconnectFromHost(); tcpSocket->close(); tcpSocket=nullptr; } 客戶端: 因爲客戶端是請求數據的從而一旦請求成功就會觸發connected 以後也是發送信息 tcpSocket=nullptr; tcpSocket=new QTcpSocket(this); connect(tcpSocket,&QTcpSocket::connected,[=](){ ui->textEditReader->setText("服務器鏈接成功"); }); connect(tcpSocket,&QTcpSocket::readyRead,[=](){ QByteArray array=tcpSocket->readAll(); ui->textEditReader->setText(array); }); 發送消息: void QtSocket::on_pushButtonSend_clicked() { if(tcpSocket==nullptr) { return; } QString str=ui->textEditWriter->toPlainText(); tcpSocket->write(str.toUtf8().data()); } 斷開鏈接: void QtSocket::on_pushButtonClose_clicked() { if(tcpSocket==nullptr) { return; } tcpSocket->disconnectFromHost(); tcpSocket->close(); tcpSocket=nullptr; } ------------------------------------------------------------------------------------------------