Qt网络聊天室
实现代码
服务器
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_newConnect_slot();
void on_startButton_clicked();
void on_readyRead_slot();
void send(QString mes);
private:
Ui::Widget *ui;
QTcpServer *server;
QList<QTcpSocket *> socketList;
};
#endif
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
server = new QTcpServer(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_startButton_clicked()
{
quint16 port = (quint16)ui->portEdit->text().toInt();
if(server->listen(QHostAddress::Any,port))
{
qDebug()<<"服务器创建成功";
}
else
{
qDebug()<<"服务器创建失败";
}
ui->portEdit->setEnabled(false);
ui->startButton->setEnabled(false);
connect(server,&QTcpServer::newConnection,this,&Widget::on_newConnect_slot);
}
void Widget::on_newConnect_slot()
{
QTcpSocket *socket=server->nextPendingConnection();
socketList.append(socket);
connect(socket,&QTcpSocket::readyRead,this,&Widget::on_readyRead_slot);
}
void Widget::on_readyRead_slot()
{
for(int i=0;i<socketList.count();i++)
{
if(socketList.at(i)->state() == false)
{
socketList.removeAt(i);
}
}
for(quint16 i=0;i<socketList.count();i++)
{
if(socketList.at(i)->bytesAvailable())
{
QString mes=QString::fromLocal8Bit(socketList.at(i)->readAll());
ui->listWidget->addItem(mes);
send(mes);
}
}
}
void Widget::send(QString mes)
{
for(int i =0;i<socketList.count();i++)
{
socketList.at(i)->write(mes.toLocal8Bit());
}
}
客户端
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QHostAddress>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_connectButton_clicked();
void on_connected_slot();
void on_disconnected_slot();
void on_readyRead_slot();
void on_sendButton_clicked();
private:
Ui::Widget *ui;
QTcpSocket *socket;
QString username;
bool isOk;
};
#endif
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
socket = new QTcpSocket(this);
isOk=false;
connect(socket,&QTcpSocket::connected,this,&Widget::on_connected_slot);
connect(socket,&QTcpSocket::disconnected,this,&Widget::on_disconnected_slot);
connect(socket,&QTcpSocket::readyRead,this,&Widget::on_readyRead_slot);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_connectButton_clicked()
{
QString ip=ui->ipEdit->text();
quint16 port = quint16(ui->portEdit->text().toInt());
if(isOk==false)
{
socket->connectToHost(QHostAddress(ip),port);
ui->connectButton->setText("断开连接");
isOk=true;
}
else
{
username=ui->usernameEdit->text();
QString mes=username+"退出群聊";
socket->write(mes.toLocal8Bit());
socket->disconnectFromHost();
ui->connectButton->setText("连接服务器");
isOk=false;
}
}
void Widget::on_connected_slot()
{
username=ui->usernameEdit->text();
QString mes=username+"加入群聊";
socket->write(mes.toLocal8Bit());
ui->usernameEdit->setEnabled(false);
ui->portEdit->setEnabled(false);
ui->ipEdit->setEnabled(false);
}
void Widget::on_disconnected_slot()
{
ui->usernameEdit->setEnabled(true);
ui->portEdit->setEnabled(true);
ui->ipEdit->setEnabled(true);
}
void Widget::on_readyRead_slot()
{
QString mes=QString::fromLocal8Bit(socket->readAll());
ui->listWidget->addItem(mes);
}
void Widget::on_sendButton_clicked()
{
username=ui->usernameEdit->text();
QString mes=username+":"+ui->lineEdit->text();
socket->write(mes.toLocal8Bit());
ui->lineEdit->clear();
}
运行结果
服务器
客户端