***************************************************
#include <QTcpServer> //服务器头文件
#include <QTcpSocket>//客户端头文件
#include <QList>//存放客户端容器
namespace Ui { class Widget; }
class Widget : public QWidget
Widget(QWidget *parent = nullptr);
void on_btn1_clicked();//启动按钮槽函数
void newConnection_slot();//自定义处理连接信号的槽函数]
void readyRead_slot();//自定义处理发送数据处理信号槽函数
QList<QTcpSocket *> clientList;
************************************************************
Widget::Widget(QWidget *parent)
server = new QTcpServer(this);//实例化对象,创建了一个服务器
void Widget::on_btn1_clicked()
quint16 port = ui->port->text().toUInt();
if(!server->listen(QHostAddress::Any,port))
QMessageBox::critical(this,"失败","服务器启动失败");
QMessageBox::information(this,"成功","服务器启动成功");
//如果客户端向服务器发来连接请求,服务器自动发送一个newConnection信号
connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
void Widget::newConnection_slot()
QTcpSocket *p=server->nextPendingConnection();
//如果客户端向服务器发送数据,客户端会发射一个readyRead信号
connect(p,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
void Widget::readyRead_slot()
for(int i=0;i<clientList.count();i++)
if(clientList[i]->state()==0)
for(int i=0;i<clientList.count();i++)
if(clientList[i]->bytesAvailable()!=0)
QByteArray msg = clientList[i]->readAll();
ui->msglist->addItem(QString::fromLocal8Bit(msg));
for(int j=0;j<clientList.count();j++)
clientList[j]->write(msg);

