qt
服务器端widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), tcp(new QTcpServer(this))
{ui->setupUi(this);//获取输入的端口号}
//连接成功,获取客户端套接字
void Widget::newConnection_solt()
{//打印表示有客户端连接qDebug() << "有新客户端连接";//获取套接字QTcpSocket *s = tcp->nextPendingConnection();//将获取到的套接字放入链表中socketList.push_back(s);//连接信号和槽,读取客户端发来的数据connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
//读取客户端发来的数据
void Widget::readyRead_slot()
{//遍历链表for (int i = 0;i < socketList.count(); i++) {if(socketList.at(i)->state() == 0){//移除无效客户端socketList.removeAt(i);}}for (int i=0;i< socketList.count();i++) {if(socketList.at(i)->bytesAvailable()!=0){//读取全部数据QByteArray msg = socketList.at(i)->readAll();//将数据显示到ui界面ui->listWidget->addItem(QString::fromLocal8Bit(msg));socketList.at(i)->sock-for (int j = 0;j<socketList.count();j++) {socketList.at(i)->write(msg);}}}
}
Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{quint16 port = ui->lineEdit->text().toUInt();//监听端口号if(tcp->listen(QHostAddress::Any,port)){QMessageBox::information(this,"提示","启动服务器成功");}else{QMessageBox::information(this,"提示","启动服务器失败");return;}//获取客户端的套接字connect(tcp,&QTcpServer::newConnection,this,&Widget::newConnection_solt);
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QMessageBox>
#include <QDebug>
#include <QList>
#include <QTcpSocket>
//#include <QListWidget>
//#include <QApplication>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
public slots:void newConnection_solt();void readyRead_slot();
private slots:void on_pushButton_clicked();private:Ui::Widget *ui;QTcpServer *tcp;QList<QTcpSocket *> socketList;
};
#endif // WIDGET_H
客户端 widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
#include <QHostAddress>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void connected_slot();void readyRead_slot();void disconnected_slot();
private slots:void on_connectBtn_clicked();void on_pushButton_clicked();void on_disconnectBtn_clicked();private:Ui::Widget *ui;QTcpSocket *socket;QString username;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),socket(new QTcpSocket(this))
{ui->setupUi(this);//设置初始不可用ui->lineEdit->setEnabled(false);ui->pushButton->setEnabled(false);ui->disconnectBtn->setEnabled(false);connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);//接收服务器发来的消息connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}
//成功连接服务器执行的槽函数
void Widget::connected_slot()
{username = ui->username->text();QString msg = username+"进入聊天室";socket->write(msg.toLocal8Bit());QMessageBox::information(this,"提示","连接服务器成功");ui->lineEdit->setEnabled(true);ui->pushButton->setEnabled(true);ui->disconnectBtn->setEnabled(true);ui->ip->setEnabled(false);ui->port->setEnabled(false);ui->username->setEnabled(false);ui->connectBtn->setEnabled(false);
}
Widget::~Widget()
{delete ui;
}
//接收服务器发来的消息
void Widget::readyRead_slot()
{QByteArray msg = socket->readAll();//将接收到的数据展示在界面ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}void Widget::on_connectBtn_clicked()
{//获取输入的ip和端口号quint16 port = ui->port->text().toUInt();socket->connectToHost(ui->ip->text(),port);}
//发送消息给服务器
void Widget::on_pushButton_clicked()
{//获取文本QString msg = ui->lineEdit->text();msg = username+":"+msg;socket->write(msg.toLocal8Bit());ui->lineEdit->clear();
}
//断开连接
void Widget::on_disconnectBtn_clicked()
{QString msg = username+"离开聊天室";socket->write(msg.toLocal8Bit());//断开连接socket->disconnectFromHost();
}void Widget::disconnected_slot()
{ui->lineEdit->setEnabled(false);ui->pushButton->setEnabled(false);ui->disconnectBtn->setEnabled(false);ui->ip->setEnabled(true);ui->port->setEnabled(true);ui->username->setEnabled(true);ui->connectBtn->setEnabled(true);
}
