Qt下Tcp通信的简单使用三
生活随笔
收集整理的這篇文章主要介紹了
Qt下Tcp通信的简单使用三
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
和之前兩個例子一樣,程序比較簡單,剛入門的可以看看,先上效果圖。
下面是客戶端:
myClient.h
myClent.cpp
#include "client.h" #include "ui_client.h" #include <QtNetwork> #include <QDebug> #include <QMessageBox> #include <QTimer>Client::Client(QWidget *parent): QDialog(parent), ui(new Ui::Client)/*,flag(0)*/ {ui->setupUi(this);myClient = new QTcpSocket(this);connect(myClient,&QTcpSocket::readyRead,this,&Client::slot_readyRead);connect(myClient,&QTcpSocket::connected,this,&Client::slot_connected);connect(myClient,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slot_error())); // connect(myClient,&QTcpSocket::disconnected,this,&Client::slot_disconnected);ui->sendButton->setEnabled(false);ui->connectStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));ui->sendStatus->setText(tr(" "));timer = new QTimer;connect(timer,&QTimer::timeout,this,&Client::slot_timeout);connect(timer,&QTimer::timeout,this,&Client::slot_sendDatatimeout); }Client::~Client() {delete ui; }void Client::slot_readyRead() {if(myClient->bytesAvailable() > 0){ui->recevieTextEdit->append(myClient->readAll());ui->receiveStatus->setText(tr("接收服務端的數據完成!!"));//timer->start(2000);} }void Client::slot_connected() {ui->connectStatus->setText(tr("連接成功"));ui->sendButton->setEnabled(true); }void Client::slot_timeout() {ui->receiveStatus->setText(tr(" ")); }void Client::slot_error() {qDebug()<<myClient->errorString();ui->connectButton->setText(tr("連接"));ui->connectStatus->setText(tr("連接斷開"));ui->sendStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));myClient->close();//同上,都不會立即關閉套接字ui->connectButton->setChecked(false);//之前點擊時checked=true,下一次點擊時checked=false,//要想使下一次點擊時是checked=true,就必須在中間設置一次checked=false }//void Client::slot_disconnected() //{ // ui->connectButton->setText(tr("連接")); // ui->connectStatus->setText(tr("連接斷開")); // ui->sendStatus->setText(tr(" ")); // ui->receiveStatus->setText(tr(" ")); // myClient->disconnectFromHost();//等待所有的數據被寫完之后,關閉套接字 // myClient->close();//同上,都不會立即關閉套接字 // flag = 1; //}void Client::on_connectButton_clicked(bool checked)//第一次點擊時為checked=true,第二次點擊時checked=false,依次類推 {if(ui->IPLineEdit->text().isEmpty() || ui->portLineEdit->text().isEmpty()){QMessageBox::information(this,tr("提示"),tr("請查看IP和端口是否輸入"));return ;}if(checked){ui->connectButton->setText(tr("斷開連接"));ui->connectStatus->setText(tr("連接中......"));myClient->connectToHost(ui->IPLineEdit->text(),ui->portLineEdit->text().toInt());}else{ui->connectButton->setText(tr("連接"));ui->connectStatus->setText(tr("連接斷開"));ui->sendStatus->setText(tr(" "));ui->sendButton->setEnabled(false);myClient->close();} }void Client::on_sendButton_clicked() {QByteArray text = ui->sendTextEdit->toPlainText().toUtf8();if(text.isEmpty()){QMessageBox::information(this,tr("提示"),tr("請輸入要發送的數據"));return ;}qint64 bytes = myClient->write(text);if(bytes > 0){ui->sendTextEdit->clear();ui->sendStatus->setText(tr("發送數據成功!"));timer->start(2000);}else{ui->sendTextEdit->clear();ui->sendStatus->setText(tr("發送數據失敗!"));timer->start(2000);} }void Client::slot_sendDatatimeout() {ui->sendStatus->setText(tr(" ")); }//void Client::on_sendTextEdit_cursorPositionChanged() //{ // ui->sendStatus->setText(tr(" ")); //}//void Client::on_sendTextEdit_textChanged() //{// ui->sendStatus->setText(tr(" ")); //}服務端:
myServer.h
myServer.cpp
#include "server.h" #include "ui_server.h" #include <QtNetwork> #include <QDebug> #include <QMessageBox>Server::Server(QWidget *parent): QDialog(parent), ui(new Ui::Server) {ui->setupUi(this);myServer = new QTcpServer(this);connect(myServer,&QTcpServer::newConnection,this,&Server::slot_newConnect);ui->disconnectButton->setEnabled(false);ui->connectStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));ui->sendStatus->setText(tr(" "));timer = new QTimer;connect(timer,&QTimer::timeout,this,&Server::slot_timeout);connect(timer,&QTimer::timeout,this,&Server::slot_sendDatatimeout); }Server::~Server() {delete ui; }void Server::slot_newConnect() {ui->connectStatus->setText(tr("連接成功"));ui->disconnectButton->setEnabled(true);socketConnected = myServer->nextPendingConnection();connect(socketConnected,SIGNAL(readyRead()),this,SLOT(slot_readyRead()));connect(socketConnected,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slot_error(QAbstractSocket::SocketError)));myServer->close(); }void Server::slot_readyRead() {if(socketConnected->bytesAvailable() > 0){ui->receiveTextEdit->append(socketConnected->readAll());ui->receiveStatus->setText(tr("接收數據成功!"));timer->start(2000);} }void Server::slot_error(QAbstractSocket::SocketError)//在連接過程中,突然被斷開,客戶端主動斷開連接時會調用該函數,服務端自己斷開連接,不會調用該函數 {qDebug()<<socketConnected->errorString();ui->connectStatus->setText(tr("連接中斷"));ui->receiveStatus->setText(tr(" "));ui->sendStatus->setText(tr(" "));ui->disconnectButton->setEnabled(false);socketConnected->disconnectFromHost();myServer->close(); }void Server::slot_timeout() {ui->receiveStatus->setText(tr(" ")); }void Server::on_listenButton_clicked() {if(!myServer->listen(QHostAddress::LocalHost,7878)){qDebug()<<"監聽失敗!!";ui->connectStatus->setText(tr("監聽失敗"));}ui->connectStatus->setText(tr("監聽成功!!!")); }void Server::on_disconnectButton_clicked() {ui->connectStatus->setText(tr("連接斷開"));ui->sendStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));ui->disconnectButton->setEnabled(false);socketConnected->abort();//立即斷開myServer->close(); }void Server::on_sendButton_clicked() {if(ui->sendTextEdit->toPlainText().isEmpty()){QMessageBox::information(this,tr("提示"),tr("請輸入要發送的數據!!"));return ;}qint64 bytes = socketConnected->write(ui->sendTextEdit->toPlainText().toUtf8());if(bytes > 0){ui->sendTextEdit->clear();ui->sendStatus->setText(tr("發送數據成功!!"));timer->start(2000);}else{ui->sendTextEdit->clear();ui->sendStatus->setText(tr("發送數據失敗!!"));timer->start(2000);}//ui->sendTextEdit->clear();//為什么在這里的時候達不到先顯示數據發送的結構,再將提示小時 }void Server::slot_sendDatatimeout() {ui->sendStatus->setText(tr(" ")); }//void Server::on_sendTextEdit_cursorPositionChanged() //{ // ui->sendStatus->setText(tr(" ")); //}運行服務端的程序,點擊監聽按鈕,運行客戶端,輸入IP和端口,IP是本地地址,端口為7878,點擊連接按鈕,連接成功后,窗口下面均有連接成功的提示,此時可以客戶端和服務端之間相互發送消息,也可以在客戶端和服務端任意斷開連接后重連,窗口消息發送與接收都有是否成功的提示,沒有輸入IP和端口之前,若點擊了連接按鈕,會有提示。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Qt下Tcp通信的简单使用三的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中dynamic_cast的简介
- 下一篇: Qt下自适应分辨率