tcp编程中写的一个简单的单项传输数据的小例子,和上一节一样,分为客户端和服务端程序,下面看一下界面的效果。


创建的方法和之前一样,上面上代码:
客户端
Client.h

#ifndef CLIENT_H
#define CLIENT_H#include <QDialog>
#include <QAbstractSocket>QT_BEGIN_NAMESPACE
namespace Ui { class Client; }
QT_END_NAMESPACE
class QTcpSocket;
class Client : public QDialog
{Q_OBJECTpublic:Client(QWidget *parent = nullptr);~Client();private slots:void displayTip();void errorTip(QAbstractSocket::SocketError);void on_sendButton_clicked();void on_connectButton_clicked(bool checked);void on_textEdit_cursorPositionChanged();private:Ui::Client *ui;QTcpSocket *tcpClient;qint8 flag;
};
#endif // CLIENT_H

Client.cpp

#include "client.h"
#include "ui_client.h"
#include <QtNetwork>
#include <QMessageBox>
#include <QDebug>
/*问题描述
@1 再次输入要发送的文本时,上次发送成功的提示依旧存在;
@2 断开连接后,上次发送成功的提示依旧存在;*/
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()<<"发生错误:"<<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();//只能输出英文和数字,即拉丁文,汉字会被?代替
//    QByteArray text = str.toLocal8Bit();//只能输出英文和数字,汉字会被乱码qint64 bytes = tcpClient->write(text);if(bytes > 0){//        qDebug()<<"发送成功!";ui->textEdit->clear();ui->tipLabel->setText(tr("数据发送成功!"));}
}void Client::on_connectButton_clicked(bool checked)
{if(ui->IPLineEdit->text().isEmpty() || ui->portLineEdit->text().isEmpty()){QMessageBox::information(this,tr("警告"),tr("请查看主机名或端口是否已输入"));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();//等待所有数据传输完成后,关闭套接字
//        tcpClient->close();//不会立即关闭套接字tcpClient->abort();//立即关闭套接字}
}void Client::on_textEdit_cursorPositionChanged()
{ui->tipLabel->setText(tr(" "));
}

服务端的程序:
Server.h

#ifndef SERVER_H
#define SERVER_H#include <QDialog>
#include <QAbstractSocket>QT_BEGIN_NAMESPACE
namespace Ui { class Server; }
QT_END_NAMESPACEclass QTcpServer;
class QTcpSocket;class Server : public QDialog
{Q_OBJECTpublic:Server(QWidget *parent = nullptr);~Server();private slots:void dataDisplayTip();void recevieData();void dealData();void errorTip(QAbstractSocket::SocketError);void on_listenButton_clicked();void on_disconnectButton_clicked();private:Ui::Server *ui;QTcpServer * myServer;QTcpSocket *socketConnected;
};
#endif // SERVER_H

Server.cpp

#include "server.h"
#include "ui_server.h"
#include <QtNetwork>
#include <QTimer>
#include <QDebug>/*问题描述
@1 客户端单一方面断开与服务器的连接时,服务器不应该显示为连接异常;
@2 服务器在与客户端连接的过程中,可以选择单方面断开与客户端的连接;
@3 客户端发送中文时,服务端显示乱码;*/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()<<"监听失败!";ui->statusLabel->setText(tr("监听失败!"));myServer->close();}ui->statusLabel->setText(tr("监听成功"));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();
}

先运行服务端程序,点击监听按钮,再运行客户端程序,输入IP和端口,同样程序之间实现的是本地地址通信,端口6787,主机名或ip都可以,点击连接,若主机名和IP没有填写,直接点击连接,会弹出提示窗口,提示查看IP和端口的填写情况,对话框下面会显示连接状态,连接成功后,输入要发送的内容,点击发送按钮可以发送信息,会有相应的发送和接收数据成功与否的显示。
效果图如下:

该注意的点:
在数据传输的过程中,编码格式的一致,否则会导致乱码,代码中含有我对与一些函数的理解,加以记录,以备后用。

Qt中Tcp通信的简单使用二相关推荐

  1. Qt中UDP通信的简单示例

    udp通信分为发送端和接收端,通信步骤可以分为以下: 接收端: 创建QUdpSocket对象.在.h文件中添加类的前置声明,定义该类的指针,在.cpp的构造函数中定义指向该类的指针. bind().绑 ...

  2. Qt下Tcp通信的简单使用三

    和之前两个例子一样,程序比较简单,刚入门的可以看看,先上效果图. 下面是客户端: myClient.h #ifndef CLIENT_H #define CLIENT_H#include <QD ...

  3. qint64转为qstring qt_Qt项目中TCP通信的实现方式经验总结(服务端部分)

    总第20篇 本文接第19篇,继续梳理TCP通信过程中的重要知识.本文主要系统地讲解通信服务端部分,以供在以后的项目开发过程中参考.如果觉得不错可以关注专栏 面向加薪编程C/C++ ,第一时间接收文章更 ...

  4. Qt关于Tcp通信步骤的总结

    Qt中TCP通信,与C++中tcp通信还是有差别的,下面总结一下Qt中TCP通信. 服务端: 创建QTcpServer对象.可以在构造函数中创建,在.h中声明类QTcpServer,并在类中定义其指针 ...

  5. QT中TCP文件传输

    QT中TCP文件传输 一.UI文件 1.serverwidget.ui 2.clientwidget.ui 二..h文件 1.serverwidget.h 2.clientwidget.h 三.cpp ...

  6. c++语言 tcp例子,C++中TCP通信实现文件传输

    作为Computer networks课程的一个project,我们需要实现用TCP在mininet中client和server的相互通信,需要能够传输文本文件,binary file 和image ...

  7. qt中socket通信流程图_使用QT实现简单的tcp/ip通信

    使用QT实现tcp/ip的通信非常的简单,下面我将直接贴出代码: 一.服务器端 1.头文件#ifndef SERVERWIDGET_H #define SERVERWIDGET_H #include ...

  8. 基于QT的TCP通信

    一.简介 TCP通信必须先建立TCP链接,通信端分为客户端和服务器端.QT提供了QTcpServer类和QTcpSocket类用于建立TCP通信应用程序.QTcpServer用于端口监听,建立服务器: ...

  9. QT中串口通信程序(转)

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三 ...

最新文章

  1. http协议头信息详解
  2. 面向对象的5个基本设计原则
  3. IIS 发布网站到外网
  4. 知识库问答中的关系识别研究回顾
  5. Qt Creator使用版本控制系统
  6. django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
  7. php 创mysql_PHP MySQL 创建表
  8. ubuntu18.04安装unity tweak tool
  9. tuning 02 Diagnostic and Tuning Tools
  10. pku1063 Flip and Shift严格证明
  11. 安装vs2008之后系统好像变慢了?
  12. matlab数字信号处理 王彬 pdf,MATLAB数字信号处理
  13. php mysqli 字段缺失,mysqli 为什么不提示字段异常
  14. 取消一个项目git版本控制
  15. unity3d工程Plugin文件夹笔记
  16. 公有云、私有云及混合云应用场景辨析
  17. Mysql 1864 主从错误解决方法
  18. [导入]中国车牌号的识别
  19. D-月之暗面(树形dp)
  20. mysql性能监控 调优_MySQL管理之道:性能调优、高可用与监控(第2版)

热门文章

  1. 模仿Spring实现一个类管理容器
  2. 阿里仿真灰度变更测试简介
  3. 技术干货 | 如何在 Library 中使用/依赖 mPaaS?
  4. 实时计算无线数据分析
  5. RocksDB 写入流程详解
  6. 承担集团数万应用、研发人员日常工作,阿里持续交付平台的设计、迭代之道... 1
  7. 锐捷发布极简以太全光解决方案 打造“不一样”的全光网
  8. Hadoop精华问答 | Hadoop 和Spark有什么区别?
  9. libmysqld_dev linux,解决mysql安装mysqld doesn\'t exist or is not-鸟哥のlinux-ChinaUnix博客
  10. git 撤销挂起的更改_小姐姐带你用Git