基于QT(C++ 和 qml)的TCP聊天程序(Server+Client)

这篇博客介绍了如何使用QTQuick和QML构建一个TCP聊天程序,包括服务器端和客户端。作者首先在工程pro文件中引入必要的组件,然后创建一个继承自QObject的类,并编写了开始侦听、接收和发送数据、停止侦听等关键函数。通过QML与C++的交互,实现了界面与服务器功能的结合,允许用户在界面上输入IP和端口启动服务器,接收到的消息会在界面上显示。客户端的代码则简化为服务器部分的功能。整体运行效果简洁,主要关注功能实现。
摘要由CSDN通过智能技术生成

TCP服务器端

接触QT一段时间了,也写过几个简单的项目,总体上感觉还可以,只是对安卓的支持个人感觉还不行,也可能是我菜,本文记录一下学习过程方便以后回头看,如果对你有所帮助那更好。我没有使用传统的Qwidgets,和Qmainwindow,采用qml语言进行界面设计,下面开始了。

准备工作

第一步,需要在你工程的pro文件中加入QT += network,我的是QTQuick工程看起来像这样
在这里插入图片描述
第二步新建一个类,我的类名是TCPServer,记得继承QObject并且使用Q_OBJECT
在这里插入图片描述
OK下面开始注入灵魂。

服务器相关函数编写

一个简单的TCP服务器其实很简单,包含开始侦听、接收数据、发送数据、停止侦听,跟把大象装冰箱一样。

开始侦听函数:

1.包含相关的头文件

		#include <QTcpSocket> 
 		#include <QTcpServer>

2.在我们新建类的构造函数里新建两个对象分别是QTcpServer类的对象和QTcpSocket类的对象
在这里插入图片描述
这里我定义的方式是 ,在头文件里定义两个public的指针,然后再构造函数里面再去new,也可以直接定义,看个人喜好。
在这里插入图片描述
3.侦听函数也十分简单,QTcpServer类里面就包含这个方法,我们直接把IP地址和端口传进去就行了,我输入参数都用的QString类,方便和qml里面的text进行交互。
在这里插入图片描述

停止侦听

在这里插入图片描述

不多说了,一看就明白。

往客户端发送消息、从客户端读取消息

1.发送数据到服务器:
在这里插入图片描述
第一句qDebug()是我调试时为了看数据 ,可以不加。

2.接收来自客户端的数据:

在这里插入图片描述
这是一个槽函数,因为再socket接收到数据后,会发送一个readReady()信号,我们把这个信号和上面槽函数相连,收到数据后就会触发槽函数处理(这里我写的只是聊天程序,只需要简单读出来,需要处理的时候就可以在这里处理)。
这里读出来之后我手动发射了一个我自己定义的信号,到qml里面去接收,方便我做显示。信号定义如下:
在这里插入图片描述

创建连接

还有一个比较容易忽略的东西,就是当有客户端连接到服务器时,服务器要用一个socket去和客户端通信

在这里插入图片描述
至此有关服务器的相关函数都已经写完了,如下:
在这里插入图片描述

qml与C++交互的补充

public的函数前面加Q_INVOKABLE,是为了让qml能够访问到这些函数,当然前提是需要把这个类注册到qml成为一个元对象。只需要在main里面加这么一句代码:

qmlRegisterType<TCPServer>("My.tcpserver",1,12,"TcpServer");

<>里面的TCPServer代表的是我们定义的那个类的名字,最后那个“TcpServer”,是注册之后元对象的名字,就像Qml里面的Button一样,都是一个控件。然后我们只要在qml里面import一下就可以使用这个控件了。

import My.tcpserver 1.12

在这里插入图片描述
我这里接收到来自C++那边发送的data_Is_Coming()信号,就把接收到的数据显示在一个TextEdit里面,接收信号地方法就是on+信号名(首字母变大写),当这个信号触发之后,就会自动进入这个函数。

关于其他一些通过输入框填写IP地址和端口也是,直接在qml用我们注册过来的元对象的id调用我们之前写好的开始侦听函数,我这里id就在上图中id:tcpserver
在这里插入图片描述
TextInput里面的text是String类型,等同于QString,这也是为什么我前面函数输入参数都用QString,就是为了方便通过qml界面传入。

其他停止侦听和发送数据,都是一样的操作,就不细讲了,我把代码放在下面:


//tcpserver.h

#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QObject>
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>

class TCPServer :public QObject
{
   
    Q_OBJECT



public:
    TCPServer();
    Q_INVOKABLE void listen_To_Client(const QString &addr,QString port);
    Q_INVOKABLE void quit_Listen();
    Q_INVOKABLE void send_Data_To_Client(const QString data);
    Q_INVOKABLE QByteArray get_Read_Buf();

    QByteArray recieve_buf;
    QTcpSocket *servertcpsocket;
    QTcpServer *tcpserver;

public slots:
    void server_New_Connect();
    void read_From_Client();

signals:
    void successed_Connected_to_Server();
    void successed_Disconnected_To_Server();
    void data_Is_Coming();
};

#endif // TCPSERVER_H

//tcpserver.cpp

#include "tcpserver.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QMessageBox>

TCPServer::TCPServer()
{
   
    tcpserver = new QTcpServer();
    servertcpsocket = new QTcpSocket;


    connect(tcpserver,&QTcpServer::newConnection,this,&TCPServer::server_New_Connect);
}

void TCPServer::listen_To_Client(const QString &addr,QString port)
{
   
    tcpserver->listen(QHostAddress(addr), port.toInt());
}

void TCPServer::quit_Listen()
{
   
    tcpserver->close();
}

void TCPServer::send_Data_To_Client(const QString data)
{
   
    qDebug()<<data.toUtf8();
    servertcpsocket-
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值