QT 程序間通訊 Socket通訊

2021-09-19 16:48:33 字數 4151 閱讀 4038

通過qt提供的qtnetwork模組即可實現程序間通訊,tcp/ip在實現應用程式和程序內部通訊或與遠端程序間的通訊方面非常有用。qtnetwork模組提供的類能夠建立基於tcp/ip的客戶端與服務端應用程式。為實現底層的網路訪問,可以使用qtcpsocket、qtcpserver和qudpsocket,並提供底層網路類。還提供了使用常規協議實現網路操作的qnetworkrequest、qnetworkreply、qnetworkaccessmanager。

tcp/ip協議:

tcp(transmission control protocol 傳輸控制協議)和ip(internet protocol 網路協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。tcp/ip提供點對點的鏈結機制,將資料應該如何封裝、定址、傳輸、路由以及在目的地如何接收,都加以標準化。它將軟體通訊過程抽象化為四個抽象層,採取協議堆疊的方式,分別實現出不同通訊協議。

socket介面:

socket又稱"套接字",用於描述ip位址和埠,是乙個通訊鏈的控制代碼,可以用來實現不同虛擬機器或不同計算機之間的通訊。建立網路通訊連線至少要一對埠號(socket)。socket本質是程式設計介面(api),對tcp/ip的封裝,tcp/ip也要提供可供程式設計師做網路開發所用的介面,這就是socket程式設計介面;tcp/ip是轎車,提供了封裝或者顯示資料的具體形式;socket是發動機,提供了網路通訊的能力。

使用qtcpserver和qtcpsocket之前都需要在pro檔案中加入:

qt       += network
一、伺服器:      

1.建立qtcpserver物件

2.啟動伺服器(監聽)呼叫成員方法listen(qhostaddress::any, 埠號)

3.當有客戶端鏈結時候會傳送newconnection訊號,觸發槽函式接受鏈結(得到乙個與客戶端通訊的套接字qtcpsocket)

4.qtcpsocket傳送資料用成員方法write,

5.讀資料當客戶端有資料來,qtcpsocket物件就會傳送readyread訊號,關聯槽函式讀取資料

mainwindow.h

#ifndef mainwindow_h

#define mainwindow_h

#include #include #include #include #include namespace ui

class mainwindow : public qmainwindow

;#endif // mainwindow_h

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

mainwindow::mainwindow(qwidget *parent) :

qmainwindow(parent),

ui(new ui::mainwindow)

qpalette pe;

pe.setcolor(qpalette::windowtext, qt::blue);

ui->label_severstate->setpalette(pe);

ui->label_severstate->settext("伺服器未開啟");

// 設定tablewidget不可編輯

ui->tablewidget->setedittriggers(qabstractitemview::noedittriggers);

// 關聯客戶端連線訊號newconnection

connect(server, &qtcpserver::newconnection, this, &mainwindow::server_new_connect);

}mainwindow::~mainwindow()

void mainwindow::on_btn_listen_clicked()

else

}else

// 取消偵聽

server->close();

// 修改按鍵文字

ui->btn_listen->settext("偵聽");

qpalette pe;

pe.setcolor(qpalette::windowtext, qt::blue);

ui->label_severstate->setpalette(pe);

ui->label_severstate->settext("伺服器未開啟");

}}void mainwindow::server_new_connect()

// 從客戶端接收到的訊息

void mainwindow::read_data()

static qstring ip_port, ip_port_pre;

ip_port = tr("[%1:%2]:").arg(clientsocket[i]->peeraddress().tostring().mid(7)).arg(clientsocket[i]->peerport());

// 若此次訊息的位址與上次不同,則需顯示此次訊息的客戶端位址

if (ip_port != ip_port_pre)

// 更新ip_port

ip_port_pre = ip_port;

}}void mainwindow::disconnected()

}// 刪除儲存在clientsocket列表中的客戶端資訊

clientsocket[i]->destroyed();

clientsocket.removeat(i);}}

}void mainwindow::on_btn_send_clicked()

else }}

else

}}void mainwindow::on_btn_clean_clicked()

二、客戶端  :  

1.建立qtcpsocket物件

2.鏈結伺服器connecttohost(qhostaddress("ip"),埠號)

3.qtcpsocket傳送資料用成員方法write,

4.讀資料當對方有資料來,qtcpsocket物件就會傳送readyread訊號,關聯槽函式讀取資料

mainwindow.h

#ifndef mainwindow_h

#define mainwindow_h

#include #include #include #include namespace ui

class mainwindow : public qmainwindow

;#endif // mainwindow_h

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

mainwindow::mainwindow(qwidget *parent) :

qmainwindow(parent),

ui(new ui::mainwindow)

mainwindow::~mainwindow()

void mainwindow::on_btn_connect_clicked()

else

}else

}void mainwindow::onstatechanged(int state)

else if (state == qtcpsocket::connectedstate)

}void mainwindow::onerroroccurred()

void mainwindow::read_data()

}void mainwindow::on_btn_exit_clicked()

void mainwindow::on_btn_send_clicked()

Socket程序間通訊

int socket int domain,int type,int protocol int bind int sockfd,const struct sockaddr addr,socklen t addrlen struct sockaddr in internet address.struc...

qt 程序間通訊

qt中仍可以利用傳統的程序間通訊方式 共享記憶體.在桌面環境中,在傳統的程序間通訊方式的基礎上發展了更為方便的物件導向的通訊方式 kde環境 dcop gnome環境 bonobo dbus freedesktop開源專案的linux ipc通訊機制,kde和gnome環境都能支援 qt embed...

qt 程序間通訊

qt中仍可以利用傳統的程序間通訊方式 共享記憶體.在桌面環境中,在傳統的程序間通訊方式的基礎上發展了更為方便的物件導向的通訊方式 kde環境 dcop gnome環境 bonobo dbus freedesktop開源專案的linux ipc通訊機制,kde和gnome環境都能支援 qt embed...