Qt中Tcp通信的简单使用二
生活随笔
收集整理的這篇文章主要介紹了
Qt中Tcp通信的简单使用二
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
tcp編程中寫的一個簡單的單項傳輸數(shù)據(jù)的小例子,和上一節(jié)一樣,分為客戶端和服務(wù)端程序,下面看一下界面的效果。
創(chuàng)建的方法和之前一樣,上面上代碼:
客戶端
Client.h
Client.cpp
#include "client.h" #include "ui_client.h" #include <QtNetwork> #include <QMessageBox> #include <QDebug> /*問題描述 @1 再次輸入要發(fā)送的文本時,上次發(fā)送成功的提示依舊存在; @2 斷開連接后,上次發(fā)送成功的提示依舊存在;*/ Client::Client(QWidget *parent): QDialog(parent), ui(new Ui::Client),flag(0) {ui->setupUi(this);setWindowTitle(tr("客戶端"));tcpClient = new QTcpSocket(this);connect(tcpClient,&QTcpSocket::connected,this,&Client::displayTip);void (QTcpSocket:: *errorSign)(QAbstractSocket::SocketError) = &QTcpSocket::error;connect(tcpClient,errorSign,this,&Client::errorTip);ui->connectButton->setText(tr("連接"));ui->statusLabel->setText(tr("未連接"));ui->tipLabel->setText(tr(" "));ui->sendButton->setEnabled(false); }Client::~Client() {delete ui; }void Client::displayTip() {ui->statusLabel->setText(tr("連接成功"));ui->sendButton->setEnabled(true); }void Client::errorTip(QAbstractSocket::SocketError) {qDebug()<<"發(fā)生錯誤:"<<tcpClient->errorString();tcpClient->abort();ui->statusLabel->setText(tr("連接已斷開"));ui->tipLabel->setText(tr(" "));ui->connectButton->setText(tr("連接"));flag = 1;// qDebug()<<"flag = 1"; }void Client::on_sendButton_clicked() {QString str = ui->textEdit->toPlainText();QByteArray text = str.toUtf8();//返回一個字符串的utf-8形式,可以表示所有字符 // QByteArray text = str.toLatin1();//只能輸出英文和數(shù)字,即拉丁文,漢字會被?代替 // QByteArray text = str.toLocal8Bit();//只能輸出英文和數(shù)字,漢字會被亂碼qint64 bytes = tcpClient->write(text);if(bytes > 0){ // qDebug()<<"發(fā)送成功!";ui->textEdit->clear();ui->tipLabel->setText(tr("數(shù)據(jù)發(fā)送成功!"));} }void Client::on_connectButton_clicked(bool checked) {if(ui->IPLineEdit->text().isEmpty() || ui->portLineEdit->text().isEmpty()){QMessageBox::information(this,tr("警告"),tr("請查看主機(jī)名或端口是否已輸入"));return ;}if(checked || flag == 1){ui->connectButton->setText(tr("斷開連接"));ui->statusLabel->setText(tr("連接中......"));ui->tipLabel->setText(tr(" "));tcpClient->connectToHost(ui->IPLineEdit->text(),ui->portLineEdit->text().toInt());}else{ui->connectButton->setText(tr("連接"));ui->statusLabel->setText(tr("未連接"));ui->tipLabel->setText(tr(" ")); // tcpClient->disconnectFromHost();//等待所有數(shù)據(jù)傳輸完成后,關(guān)閉套接字 // tcpClient->close();//不會立即關(guān)閉套接字tcpClient->abort();//立即關(guān)閉套接字} }void Client::on_textEdit_cursorPositionChanged() {ui->tipLabel->setText(tr(" ")); }服務(wù)端的程序:
Server.h
Server.cpp
#include "server.h" #include "ui_server.h" #include <QtNetwork> #include <QTimer> #include <QDebug>/*問題描述 @1 客戶端單一方面斷開與服務(wù)器的連接時,服務(wù)器不應(yīng)該顯示為連接異常; @2 服務(wù)器在與客戶端連接的過程中,可以選擇單方面斷開與客戶端的連接; @3 客戶端發(fā)送中文時,服務(wù)端顯示亂碼;*/Server::Server(QWidget *parent): QDialog(parent), ui(new Ui::Server) {ui->setupUi(this);myServer = new QTcpServer(this);connect(myServer,&QTcpServer::newConnection,this,&Server::recevieData); // connect(myServer,&QTcpServer::connected,this,&Server::tipInfo);ui->statusLabel->setText(tr("未建立連接"));ui->RecevieDataLabel->setText(tr(" "));}Server::~Server() {delete ui; }void Server::dataDisplayTip() {ui->RecevieDataLabel->setText(tr(" ")); }void Server::recevieData() {ui->statusLabel->setText(tr("連接成功"));socketConnected = myServer->nextPendingConnection();connect(socketConnected,&QTcpSocket::readyRead,this,&Server::dealData);void (QTcpSocket:: *errorSign)(QAbstractSocket::SocketError) = &QTcpSocket::error;connect(socketConnected,errorSign,this,&Server::errorTip);myServer->close(); }void Server::dealData() {if(socketConnected->bytesAvailable()>0){QString str = socketConnected->readAll();//QByteArray dataui->textEdit->append(str);ui->RecevieDataLabel->setText(tr("消息接收完成!"));QTimer *timer = new QTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(dataDisplayTip()));timer->start(2000);} }void Server::errorTip(QAbstractSocket::SocketError) {qDebug()<<socketConnected->errorString();ui->listenButton->setEnabled(true);socketConnected->close();myServer->close();ui->statusLabel->setText(tr("連接中斷"));ui->RecevieDataLabel->setText(tr(" ")); }void Server::on_listenButton_clicked() {if(!myServer->listen(QHostAddress::LocalHost,6787)){qDebug()<<"監(jiān)聽失敗!";ui->statusLabel->setText(tr("監(jiān)聽失敗!"));myServer->close();}ui->statusLabel->setText(tr("監(jiān)聽成功"));ui->RecevieDataLabel->setText(tr(" "));ui->listenButton->setEnabled(false); }void Server::on_disconnectButton_clicked() {ui->statusLabel->setText(tr("連接中斷"));ui->RecevieDataLabel->setText(tr(" "));ui->listenButton->setEnabled(true);socketConnected->disconnectFromHost();myServer->close(); }先運行服務(wù)端程序,點擊監(jiān)聽按鈕,再運行客戶端程序,輸入IP和端口,同樣程序之間實現(xiàn)的是本地地址通信,端口6787,主機(jī)名或ip都可以,點擊連接,若主機(jī)名和IP沒有填寫,直接點擊連接,會彈出提示窗口,提示查看IP和端口的填寫情況,對話框下面會顯示連接狀態(tài),連接成功后,輸入要發(fā)送的內(nèi)容,點擊發(fā)送按鈕可以發(fā)送信息,會有相應(yīng)的發(fā)送和接收數(shù)據(jù)成功與否的顯示。
效果圖如下:
該注意的點:
在數(shù)據(jù)傳輸?shù)倪^程中,編碼格式的一致,否則會導(dǎo)致亂碼,代碼中含有我對與一些函數(shù)的理解,加以記錄,以備后用。
總結(jié)
以上是生活随笔為你收集整理的Qt中Tcp通信的简单使用二的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java项目功能详情介绍,JAVAEE—
- 下一篇: qt中QList使用removeAt()