Qt中使用Tcp构建通信客户端实现聊天信息发送连接等

  • 1.简介
  • 2.项目创建和界面构建
    • 1)流程图
    • 2)项目构建
    • 3)界面构建
  • 3.代码设计
    • 1)项目pro添加
    • 2)客户端设计
      • a. clientwidget.h
      • b.clientwdige.cpp
    • 3)服务端设计
      • a.serverwidget.h
      • b.serverwidget.cpp
  • 4.源代码附录
    • clientwidget.h
    • clientwidget.cpp
    • serverwidget.h
    • serverwidget.cpp
  • 5.源文件下载

1.简介

TCP通信协议是面向对象,可靠的连接服务,正因为这是它最大的特点,因此在诸多领域应用广泛,在使用Qt进行面向对象的设计的时候,也常常用到TCP通信,而在Qt中,TCP协议被封装成了一个更易调用的类。此篇博文将使用Qt中的TCP通信来实现客户端和服务端的连接交互通信,以此作为延伸。
在之前的一篇博文中 ,Linux中C语言构建TCP通信,使用了C语言对TCP协议进行调用,来实现客户端和服务端的通信连接。而Qt中的TCP通信连接步骤和C语言中原生tcp连接的步骤一样,大体都是分为以下大类

  • 创建套接字
  • 绑定本机地址和端口
  • 设置监听套接字
  • 主动向服务器(客户端)发送请求
  • 客户端(服务器)接受连接请求
  • 接受/发送数据
  • (双方)关闭套接字

区别在于,Qt中调用TCP的方式简单,可以实现如下的效果

以下是详细的实际实现

2.项目创建和界面构建

1)流程图

TCP协议通信逻辑图有下图,根据此逻辑图,可以更好的理解Qt中的TCP协议的调用

2)项目构建

创建widget项目,除自有界面外,再添加一个新的界面,构建如下图所示的项目文件树

3)界面构建

客户端界面构建


服务端界面构建

两个界面大体是构建上面是显示消息栏。下面是输入消息发送栏。

3.代码设计

1)项目pro添加

第一步需要在项目的pro文件中添加网络通信模块

QT       += network

2)客户端设计

a. clientwidget.h

首先需要添加所需头文件,用于tcp通信

#include <QTcpSocket>

之后是tcp通信的类的声明以及一个相应键盘事件的事件过滤器

private:QTcpSocket *tcpSocket;
protected:bool eventFilter(QObject *target, QEvent *event);//事件过滤器
};

b.clientwdige.cpp

同样是添加所需工具头文件

#include <QHostAddress>
#include <QDebug>
#include <QTime>
#include <QKeyEvent>

之后是构造函数和部分相关函数的设计

ClientWidget::ClientWidget(QWidget *parent) :QWidget(parent),ui(new Ui::ClientWidget)
{ui->setupUi(this);this->setWindowTitle("客户端");this->resize(500,300);this->setMinimumSize(500,300);tcpSocket = new QTcpSocket(this);connect(tcpSocket,&QTcpSocket::connected,[=](){ui->textEditRead->setText("与服务器成功连接");qDebug() << "连接成功";});connect(tcpSocket,&QTcpSocket::readyRead,[=](){QByteArray array = tcpSocket->readAll();ui->textEditRead->append(array);});ui->ButtonSend->setFocus();ui->ButtonSend->setDefault(true);//ui->ButtonSend->setShortcut(Qt::Key_Enter|Qt::Key_Return);ui->textEditWrite->installEventFilter(this);//设置完后自动调用其eventFilter函数
}ClientWidget::~ClientWidget()
{delete ui;
}void ClientWidget::on_ButtonConnect_clicked()
{//获取服务器端口和ipQString ip = ui->lineEditIp->text();qint16 port = ui->lineEditPort->text().toInt();//与服务器进行连接tcpSocket->connectToHost(QHostAddress(ip),port);
}void ClientWidget::on_ButtonSend_clicked()
{//获取编辑框内容QTime cur_time = QTime::currentTime();QString str = ui->textEditWrite->toPlainText();QString time_info = cur_time.toString("hh:mm:ss");QString str_info = QString("客户端: %1 [%2]").arg(str).arg(time_info);//发送数据tcpSocket->write(str_info.toUtf8().data());ui->textEditWrite->clear();//ui->textEditWrite->setFocus();
}void ClientWidget::on_ButtonClose_clicked()
{//主动断开连接tcpSocket->disconnectFromHost();ui->textEditRead->setText("与服务器断开连接!");tcpSocket->close();
}

3)服务端设计

a.serverwidget.h

添加头文件

#include <QTcpServer>   //监听套接字
#include <QTcpSocket>   //通信套接字

通信套接字声明实现和事件过滤器

private:QTcpServer *tcpServer;QTcpSocket *tcpSocket;
protected:bool eventFilter(QObject *target, QEvent *event);//事件过滤器

b.serverwidget.cpp

添加工具头文件

#include <QTime>
#include <QKeyEvent>

构造函数设计

ServerWidget::ServerWidget(QWidget *parent) :QWidget(parent),ui(new Ui::ServerWidget)
{ui->setupUi(this);tcpServer = NULL;tcpSocket = NULL;//tcpServer  = new QTcpServer(this);tcpSocket = new QTcpSocket(this);tcpServer->listen(QHostAddress::Any,8888);this->setWindowTitle("服务器(端口:8888)");this->resize(500,300);this->setMinimumSize(500,300);connect(tcpServer,&QTcpServer::newConnection,[=](){//取出建立好连接的套接字tcpSocket = tcpServer->nextPendingConnection();//获取对方的ip和端口sstatic QString ip = tcpSocket->peerAddress().toString();static 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);        //追加添加内容});});
//    connect(tcpSocket,&QTcpSocket::readyRead,
//            [=]()
//            {//                //从通信套接字中取出内容
//                QByteArray array = tcpSocket->readAll();
//                ui->textEditRead->append(array);        //追加添加内容
//            }
//            );ui->ButtonSend->setFocus();ui->ButtonSend->setDefault(true);//ui->ButtonSend->setShortcut(Qt::Key_Enter|Qt::Key_Return);ui->textEditWrite->installEventFilter(this);//设置完后自动调用其eventFilter函数}

经此设计构建之后可以实现如上的功能操作,有此基础之后可以自定定义自己的服务器,如智能小车的控制,摄像头图像的传递识别等等

4.源代码附录

clientwidget.h

#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H#include <QWidget>
#include <QTcpSocket>namespace Ui {class ClientWidget;
}class ClientWidget : public QWidget
{Q_OBJECTpublic:explicit ClientWidget(QWidget *parent = nullptr);~ClientWidget();private slots:void on_ButtonSend_clicked();void on_ButtonConnect_clicked();void on_ButtonClose_clicked();private:Ui::ClientWidget *ui;private:QTcpSocket *tcpSocket;
protected:bool eventFilter(QObject *target, QEvent *event);//事件过滤器
};#endif // CLIENTWIDGET_H

clientwidget.cpp

#include "clientwidget.h"
#include "ui_clientwidget.h"
#include <QHostAddress>
#include <QDebug>
#include <QTime>
#include <QKeyEvent>ClientWidget::ClientWidget(QWidget *parent) :QWidget(parent),ui(new Ui::ClientWidget)
{ui->setupUi(this);this->setWindowTitle("客户端");this->resize(500,300);this->setMinimumSize(500,300);tcpSocket = new QTcpSocket(this);connect(tcpSocket,&QTcpSocket::connected,[=](){ui->textEditRead->setText("与服务器成功连接");qDebug() << "连接成功";});connect(tcpSocket,&QTcpSocket::readyRead,[=](){QByteArray array = tcpSocket->readAll();ui->textEditRead->append(array);});ui->ButtonSend->setFocus();ui->ButtonSend->setDefault(true);//ui->ButtonSend->setShortcut(Qt::Key_Enter|Qt::Key_Return);ui->textEditWrite->installEventFilter(this);//设置完后自动调用其eventFilter函数
}ClientWidget::~ClientWidget()
{delete ui;
}void ClientWidget::on_ButtonConnect_clicked()
{//获取服务器端口和ipQString ip = ui->lineEditIp->text();qint16 port = ui->lineEditPort->text().toInt();//与服务器进行连接tcpSocket->connectToHost(QHostAddress(ip),port);
}void ClientWidget::on_ButtonSend_clicked()
{//获取编辑框内容QTime cur_time = QTime::currentTime();QString str = ui->textEditWrite->toPlainText();QString time_info = cur_time.toString("hh:mm:ss");QString str_info = QString("客户端: %1 [%2]").arg(str).arg(time_info);//发送数据tcpSocket->write(str_info.toUtf8().data());ui->textEditWrite->clear();//ui->textEditWrite->setFocus();
}void ClientWidget::on_ButtonClose_clicked()
{//主动断开连接tcpSocket->disconnectFromHost();ui->textEditRead->setText("与服务器断开连接!");tcpSocket->close();
}bool ClientWidget::eventFilter(QObject *target, QEvent *event)
{if(target == ui->textEditWrite){if(event->type() == QEvent::KeyPress)//回车键{QKeyEvent *k = static_cast<QKeyEvent *>(event);if(k->key() == Qt::Key_Return){on_ButtonSend_clicked();return true;}}}return QWidget::eventFilter(target,event);}

serverwidget.h

#ifndef SERVERWIDGET_H
#define SERVERWIDGET_H#include <QWidget>
#include <QTcpServer>   //监听套接字
#include <QTcpSocket>   //通信套接字namespace Ui {class ServerWidget;
}class ServerWidget : public QWidget
{Q_OBJECTpublic:explicit ServerWidget(QWidget *parent = nullptr);~ServerWidget();
protected:bool eventFilter(QObject *target, QEvent *event);//事件过滤器private slots:void on_ButtonClose_clicked();void on_ButtonSend_clicked();private:Ui::ServerWidget *ui;private:QTcpServer *tcpServer;QTcpSocket *tcpSocket;//    QString ip;
//    qint16 port;};#endif // SERVERWIDGET_H

serverwidget.cpp

#include "serverwidget.h"
#include "ui_serverwidget.h"
#include <QTime>
#include <QKeyEvent>ServerWidget::ServerWidget(QWidget *parent) :QWidget(parent),ui(new Ui::ServerWidget)
{ui->setupUi(this);tcpServer = NULL;tcpSocket = NULL;//tcpServer  = new QTcpServer(this);tcpSocket = new QTcpSocket(this);tcpServer->listen(QHostAddress::Any,8888);this->setWindowTitle("服务器(端口:8888)");this->resize(500,300);this->setMinimumSize(500,300);connect(tcpServer,&QTcpServer::newConnection,[=](){//取出建立好连接的套接字tcpSocket = tcpServer->nextPendingConnection();//获取对方的ip和端口sstatic QString ip = tcpSocket->peerAddress().toString();static 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);        //追加添加内容});});
//    connect(tcpSocket,&QTcpSocket::readyRead,
//            [=]()
//            {//                //从通信套接字中取出内容
//                QByteArray array = tcpSocket->readAll();
//                ui->textEditRead->append(array);        //追加添加内容
//            }
//            );ui->ButtonSend->setFocus();ui->ButtonSend->setDefault(true);//ui->ButtonSend->setShortcut(Qt::Key_Enter|Qt::Key_Return);ui->textEditWrite->installEventFilter(this);//设置完后自动调用其eventFilter函数}ServerWidget::~ServerWidget()
{delete ui;
}bool ServerWidget::eventFilter(QObject *target, QEvent *event)
{if(target == ui->textEditWrite){if(event->type() == QEvent::KeyPress)//回车键{QKeyEvent *k = static_cast<QKeyEvent *>(event);if(k->key() == Qt::Key_Return){on_ButtonSend_clicked();return true;}}}return QWidget::eventFilter(target,event);}void ServerWidget::on_ButtonSend_clicked()
{if(tcpSocket == NULL){return ;}//获取编辑区内容QTime cur_time = QTime::currentTime();QString str = ui->textEditWrite->toPlainText();QString time_info = cur_time.toString("hh:mm:ss");QString str_info = QString("服务器: %1 [%2]").arg(str).arg(time_info);tcpSocket->write(str_info.toUtf8().data());ui->textEditWrite->clear();
}void ServerWidget::on_ButtonClose_clicked()
{if(tcpSocket == NULL)//主动与客户端断开连接tcpSocket->disconnectFromHost();static QString ip = tcpSocket->peerAddress().toString();static qint16 port = tcpSocket->peerPort();QString showtemp = QString("[%1:%2] : 断开连接").arg(ip).arg(port);ui->textEditRead->setText(showtemp);tcpSocket->close();//this->close();tcpSocket = NULL;}

5.源文件下载

详细效果,可戳传送门下载体验传送门

QT -- TcpSocket实例,使用Qt中的tcp通信协议,构建客户端和服务端,实现局域网通信软件功能相关推荐

  1. python实现淘宝客服自动回复语_Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例...

    本文实例讲述了Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能.分享给大家供大家参考,具体如下: [吐槽] 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题. 有些 ...

  2. java 网络编程(二) tcp传输实现客户端和服务端进行信息交流

    1.使用Tcp从一台电脑往另一台电脑上发送文本数据 客户端: import java.io.*; import java.net.*; /**** 客户端,* 通过查阅socket对象,发现在该对象建 ...

  3. 【学习笔记】在windows下进行基于TCP的本地客户端和服务端socket通信

    文章目录 socket介绍 java中使用socket 基于tcp的socket通信 使用ServerSocket类创建一个web服务器:(java) windows下的基于tcp的socket编程( ...

  4. tcp网络编程客户端和服务端及listen和tcp允许最大连接数

    tcp网络编程 tcp网络编程步骤: 由于tcp传输特点是可靠有连接,那么就有 1.客户端向服务端发送连接请求(SYN), 2.服务端接受请求并向客户端发送(SYN+ACK); 3.客户端向服务端回复 ...

  5. linux中UDP程序流程、客户端、服务端

    UDP--- 用户数据报协议(User Datagram Protocol),是一个无连接的简单的面向数据报的运输层协议. 优点:传输速度快 缺点:不可靠 socket的中文意思是接插件: 创建soc ...

  6. linux的tcp非阻塞客户端与服务端demo源码

    客户端#include <stdio.h> #include <string.h> #include <errno.h> #include <sys/sock ...

  7. php winform通信,C# Winform 通过Socket实现客户端和服务端TCP通信

    操作界面如下: 1.声明Socket 第一个参数:寻址方式,第二个参数:传输数据的方式,第三个参数:通信协议 Socket socket = new Socket(AddressFamily.Inte ...

  8. socket java 客户端_Java基于socket实现的客户端和服务端通信功能完整实例

    本文实例讲述了Java基于socket实现的客户端和服务端通信功能.分享给大家供大家参考,具体如下: 以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行Chat ...

  9. QT中使用C++ socket通信(了解socket通信、socket的三次握手和四次挥手、socket函数说明、客户端与服务端的代码实例)

    一.TCP/IP协议四个抽象层: 二.socket位置 socket就在应用程序的传输层和应用层之间,传输层的底一层的服务提供给socket抽象层,socket抽象层再提供给应用层. 三.socket ...

最新文章

  1. Ubuntu18.04安装Gaussian16和GaussView 6
  2. iOS开发中视图相关的小笔记:push、modal、popover、replace、custom
  3. 北京内推 | 微软亚洲互联网工程院(STCA)招聘NLP算法实习生
  4. jwt同一会话_在会话中使用JWT
  5. 分布式面试 - 为什么要进行系统拆分?
  6. 知乎:为什么魂斗罗只有128KB却可以实现那么长的剧情?
  7. 标准C字符和字符串函数
  8. linux多媒体功能,Ubuntu 8.04中文强化版 多媒体功能更强大
  9. 响应式开发---网页的布局方式、媒体查询、栅格化布局、less语言
  10. Leetcode 58 之反向迭代器的使用
  11. 海康 设备 发现(SADPTool原理)
  12. python 数据分析实践--(1)收入预测分析
  13. 基于Matlab人脸识别(PCA算法)
  14. ICode竞赛学习资料内容礼包
  15. 内测体验:GitHub Copilot智能代码补全自动写代码插件
  16. 原来学Python最好的书是这一本?它在bookauthority里排名第三
  17. 【前端】纯CSS实现探照灯效果
  18. 将保护清理不良资产的银行家:Arun Jaitley在评审会议
  19. android布局 哪个控件在最上层_Android 在最上层添加悬浮View(兼容Android 8.0)
  20. 为什么用vue,它解决了什么问题,如何使用它?

热门文章

  1. linux压缩文件恢复,Linux文件误删恢复
  2. Terracotta for Spring
  3. 一文详解窄脉冲LIV测试系统的特点和功能
  4. 99的测试人还不会用nose进行自动化测试
  5. 题目:代码实现判断单链表是否有环
  6. Android 模拟点击
  7. 详解C语言中的switch语句
  8. VBA小模板:一个普通随机抽奖,需要模拟多轮用VBA怎么做?
  9. Daily record-December
  10. electron 自动更新 热跟新