Qt: 基于QTcpSocket的聊天程序

2023-10-08 17:58
文章标签 程序 qt 聊天 qtcpsocket

本文主要是介绍Qt: 基于QTcpSocket的聊天程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下载地址:http://download.csdn.net/detail/rl529014/9660330          C++、Qt学习交流群: 302558294(欢迎你的加入)

效果图:



原理:

用到的库:QTcpServer,QTcpServer,QHostAddress,QtNetwork。


源码:

服务器端:

//mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtNetwork>
#include <QTcpServer>
#include <QTcpSocket>
#include <QTimer>
#include <QByteArray>namespace Ui
{
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();public:void init();private slots:void sendMessage(); //发送消息void onReciveData();  //接收数据void newListen(); //建立tcp监听事件void acceptConnection(); //接收客户端连接void showError(QAbstractSocket::SocketError); //错误输出private:Ui::MainWindow *ui;private:QTcpSocket *tcpSocket;QTcpServer *tcpServer;// QTimer *timer;QByteArray mChat;
};#endif // MAINWINDOW_H

//mainwindow.cpp

#include <QObject>
#include <QString>
#include <QTextEdit>
#include <QHostAddress>
#include <QByteArray>
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);init();setWindowTitle(QString::fromLocal8Bit("服务器端"));connect(ui->sendBtn,SIGNAL(clicked(bool)),SLOT(sendMessage()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::init()
{// timer = new QTimer;tcpServer = new QTcpServer;tcpSocket = new QTcpSocket;newListen();connect(tcpServer,SIGNAL(newConnection()),SLOT(acceptConnection()));connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),SLOT(showError(QAbstractSocket::SocketError)));}void MainWindow::sendMessage()  //发送数据
{QString textEdit = ui->lineEdit->text();QString strData =QString::fromLocal8Bit("Time: ") + QTime::currentTime().toString() + "\n" + textEdit.toLocal8Bit() + "\n";QByteArray sendMessage = strData.toLocal8Bit();mChat += ("Send " + sendMessage);ui->textEdit->setText(mChat);tcpSocket->write(sendMessage);
}void MainWindow::onReciveData()  //读取数据
{QString data = tcpSocket->readAll();qDebug()<<data;mChat +=("Recv " + data);ui->textEdit->setText(mChat);
}void MainWindow::newListen()
{if(!tcpServer->listen(QHostAddress::Any,6666)){qDebug()<<tcpServer->errorString();tcpServer->close();}
}void MainWindow::acceptConnection()
{tcpSocket = tcpServer->nextPendingConnection();connect(tcpSocket,SIGNAL(readyRead()),SLOT(onReciveData()));
}void MainWindow::showError(QAbstractSocket::SocketError)
{qDebug()<<tcpSocket->errorString();tcpSocket->close();
}


客户端:

//mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtNetwork>
#include <QTcpServer>
#include <QTcpSocket>
#include <QTimer>
#include <QAbstractSocket>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();public:void init();void newTcpConnect();private slots:void onReciveData();void onSendMessage();void onShowError(QAbstractSocket::SocketError);private:QTcpSocket *tcpSocket;QByteArray mChat;private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H


//mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle(QString::fromLocal8Bit("客户端"));init();connect(ui->sendBtn,SIGNAL(clicked(bool)),SLOT(onSendMessage()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::init()
{tcpSocket = new QTcpSocket;newTcpConnect();connect(tcpSocket,SIGNAL(readyRead()),SLOT(onReciveData()));
}void MainWindow::newTcpConnect()
{tcpSocket->abort();tcpSocket->connectToHost("127.0.0.1",6666);
}void MainWindow::onReciveData()
{QString data = tcpSocket->readAll();qDebug()<<data;mChat += ("Recv " + data);ui->textEdit->setText(mChat);
}void MainWindow::onSendMessage()
{QString textEdit = ui->lineEdit->text();QString strData =QString::fromLocal8Bit("Time: ") + QTime::currentTime().toString() + "\n" + textEdit.toLocal8Bit() +"\n";QByteArray sendMessage = strData.toLocal8Bit();mChat+= ("Send " + sendMessage);ui->textEdit->setText(mChat);tcpSocket->write(sendMessage);
}void MainWindow::onShowError(QAbstractSocket::SocketError)
{qDebug()<<tcpSocket->errorString();tcpSocket->close();
}


下载地址:http://download.csdn.net/detail/rl529014/9660330


C++、Qt学习交流群: 302558294(欢迎你的加入)

这篇关于Qt: 基于QTcpSocket的聊天程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167015

相关文章

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台