一个服务器可对多个客户端
直接看效果图:
下面粘贴部分源码:
MyClient::MyClient(const int clinum,const QString ip,const QString port):
ui(new Ui::MyClient),m_ip(ip),m_port(port),m_clinum(clinum)
{
ui->setupUi(this);
setWindowTitle(QString("客户端")+QString::number(clinum));
ui->lineEditIp->setText(m_ip);
ui->lineEditPort->setText(m_port);
tcpSocket=new QTcpSocket(this);
connect(tcpSocket,&QTcpSocket::connected,[=](){
ui->textEditRead->setText(QString("客户端%1:连接服务器成功!").arg(clinum));
});
connect(tcpSocket,&QTcpSocket::readyRead,[=]{
QByteArray arr = tcpSocket->readAll();
ui->textEditRead->append(arr);
});
connect(tcpSocket,&QTcpSocket::disconnected,[=](){
on_buttonClose_clicked();
});
}
MyClient::~MyClient()
{
delete ui;
}
void MyClient::on_buttonConnect_clicked()
{
qint16 port=m_port.toInt();
if(tcpSocket->isOpen())
return;
tcpSocket->connectToHost(QHostAddress(m_ip),port);
}
void MyClient::on_buttonClose_clicked()
{
if(!tcpSocket->isOpen())
{
return;
}
tcpSocket->disconnectFromHost();
tcpSocket->close();
}
void MyClient::on_buttonSend_clicked()
{
if(!tcpSocket->isOpen())
return;
QString str=QString("客户端%1:").arg(m_clinum)+ui->textEditWrite->toPlainText();
tcpSocket->write(str.toUtf8().data());
ui->textEditRead->append(str);
ui->textEditWrite->clear();
}
MyServer::MyServer(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyServer)
{
ui->setupUi(this);
setWindowTitle("服务器:8888");
tcpServer=new QTcpServer(this);
tcpServer->listen(QHostAddress::Any,8888);
connect(tcpServer,&QTcpServer::newConnection,[=](){
if(m_N>1)m_N=0;
int i=m_N++;
tcpSocketArr[i]=tcpServer->nextPendingConnection();
QString ip=tcpSocketArr[i]->peerAddress().toString();
qint16 port = tcpSocketArr[i]->peerPort();
QString str=QString("客户端[%1:%2]:连接成功").arg(ip).arg(port);
ui->textEditRead->append(str);
connect(tcpSocketArr[i],&QTcpSocket::readyRead,[=](){
temparr = tcpSocketArr[i]->readAll();
ui->textEditRead->append(temparr);
moveInfo(i);
});
connect(tcpSocketArr[i],&QTcpSocket::disconnected,[=](){
tcpSocketArr[i]->disconnectFromHost();
tcpSocketArr[i]->close();
tcpSocketArr[i]->deleteLater();
tcpSocketArr[i]=NULL;
m_N=i;
});
});
}
MyServer::~MyServer()
{
delete ui;
}
void MyServer::on_buttonClose_clicked()
{
for(int i=0;i<2;i++)
{
if(tcpSocketArr[i]!=NULL&&tcpSocketArr[i]->isOpen())
{
tcpSocketArr[i]->disconnectFromHost();
}
}
}
void MyServer::moveInfo(int num)
{
//注意此处的范围,要遍历到每一个客户端
for(int i=0;i<2;i++)
{
if(tcpSocketArr[i]!=NULL&&tcpSocketArr[i]->isOpen()&&(i!=num))
{
tcpSocketArr[i]->write(temparr);
}
}
}
若原理不太理解可以参考:基于Qt的Tcp简单通信示意图及代码实现思路大同小异
完整代码请点击
(仓库中也有一些其它小项目或Demo需要的自提,如果觉得对您有帮助的话可以star一下哟)