项目实战:Qt5/C++:TCP的C/S的聊天小程序
程序员文章站
2024-01-17 18:11:28
...
项目实战:Qt5/C++:TCP的C/S的聊天小程序: 开源之美
----------编译环境:Win10专业版x64 QtCreate5.8----------
成品效果图:
主要源码:
//********************************TcpClient*********************************
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket> //通信套接字
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
private:
Ui::Widget *ui;
QTcpSocket *pTcpSocket;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("TcpClient");
pTcpSocket = NULL;
//分配空间,指定父对象
pTcpSocket = new QTcpSocket(this);
//弹出来一个提示而已
connect(pTcpSocket, &QTcpSocket::connected,
[=]()
{
ui->textEditRead->setText("The connection server is successful.");
}
);
//显示来自服务器的消息
connect(pTcpSocket, &QTcpSocket::readyRead,
[=]()
{
//从通信套接字中间取出内容
QByteArray array = pTcpSocket->readAll();
//QString temp2 = QString("");
ui->textEditRead->append("[Server:]" + array); //在后面追加新的消息
}
);
connect(ui->pushButton_2, &QPushButton::pressed,
[=]()
{
QString str = "[Client:]" + ui->textEditWrite->toPlainText();
ui->textEditRead->append(str); //在后面追加新的消息
}
);
}
Widget::~Widget()
{
delete ui;
}
//与服务器建立连接
void Widget::on_pushButton_clicked()
{
//获得服务器的IP和端口
QString ip = ui->lineEdit->text();
qint16 port = ui->lineEdit_2->text().toInt();
//主动和服务器将建立连接
pTcpSocket->connectToHost(QHostAddress(ip), port);
}
//给服务器发送消息
void Widget::on_pushButton_2_clicked()
{
//获取编辑区域的内容
QString str = ui->textEditWrite->toPlainText();
//给对方发送消息,当有中文的时候就是用使用utf8
pTcpSocket->write(str.toUtf8().data());
}
//断开连接
void Widget::on_pushButton_3_clicked()
{
pTcpSocket->disconnectFromHost();
}
//********************************TcpServer*********************************#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer> //监听套接字
#include <QTcpSocket> //通信套接字
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButtonSend_clicked();
void on_pushButtonClose_clicked();
private:
Ui::Widget *ui;
QTcpServer *pTcpServer;
QTcpSocket *pTcpSocket;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//避免一开始用户点击Send按钮,结果程序会无法正常运行
pTcpServer = NULL;
pTcpSocket = NULL;
//指定父对象,让其自动回收该区域的空间
pTcpServer = new QTcpServer(this);
//绑定当前网卡的所有IP,和监听的端口
pTcpServer->listen(QHostAddress::Any, 8888);
//只要一建立连接成功,就会自动触发newConnection函数
connect(pTcpServer, &QTcpServer::newConnection,
[=]()
{
//取出建立好的连接套接字
pTcpSocket = pTcpServer->nextPendingConnection();
//获得客户端的IP和端口
QString ip = pTcpSocket->peerAddress().toString();
qint16 port = pTcpSocket->peerPort();
QString temp = QString("[%1:%2]:The client connection is successful.").arg(ip).arg(port);
ui->textEditRead->setText(temp);
//-----------------------------------------------------------------------------------------------
//接收到了内容之后,直接在显示区域显示消息
/**/ connect(pTcpSocket, &QTcpSocket::readyRead,
/**/ [=]()
/**/ {
/**/ //从通信套接字中间取出内容
/**/ QByteArray array = pTcpSocket->readAll();
/**/ //QString temp2 = QString("");
/**/ ui->textEditRead->append("[Client:]" + array); //在后面追加新的消息
/**/ }
/**/ );
//-----------------------------------------------------------------------------------------------
}
);
connect(ui->pushButtonSend, &QPushButton::pressed,
[=]()
{
QString str = "[Server:]" + ui->textEditWrite->toPlainText();
ui->textEditRead->append(str); //在后面追加新的消息
}
);
this->setWindowTitle("TcpServer");
}
Widget::~Widget()
{
delete ui;
}
//给客户端发送消息的功能
void Widget::on_pushButtonSend_clicked()
{
//获取编辑区域的内容
QString str = ui->textEditWrite->toPlainText();
//给对方发送消息,当有中文的时候就是用使用utf8
pTcpSocket->write(str.toUtf8().data());
}
//断开连接,拒绝接受来自客户端的消息
void Widget::on_pushButtonClose_clicked()
{
pTcpSocket->disconnectFromHost();
pTcpSocket->close();
}
源码链接:https://pan.baidu.com/s/1jIY6JKM 密码:3ynq
成品以及如何将其发布的教程(任何Win环境均可以直接运行)的视频链接:https://pan.baidu.com/s/1o9RTpEi 密码:be82
我的博客里面应该还有一篇纯C语言写的控制台模式的Tcp的基于C/S模式的通信。欢迎大家参考。
其他:以后会不定期续写的,且上面得源码都是自己学习过程的一个又一个脚印,希望也可以给你们一些启发,也给自己一个回忆,么么哒φ(>ω<*)
上一篇: php memcache安装与注意事项_PHP教程
下一篇: 哪位前端大神帮我看一下,这是怎么回事?