Qt---tcp之網絡通訊

瀏覽器與服務器之間創建鏈接的過程
--------------------------------------------------------------------------------------------------

  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;
}

------------------------------------------------------------------------------------------------
相關文章
相關標籤/搜索