实现多客户端单服务器通信
客户端
利用Qt包的情况下,客户端所作无非连接,发送,接收。
链接服务器代码
实现多客户端单服务器通信
客户端
利用Qt包的情况下,客户端所作无非连接,发送,接收。
链接服务器代码
客户端使用 QTcpSocket *tcpClient;
在QTcpSocket 下
函数connectToHost(服务器IP,端口) 链接服务器
disconnectFromHost() 断开与服务器的连接
if(ui->btn_connect->text()=="连接")
{
tcpClient->connectToHost(ui->edit_IP->text(),ui->edit_Port->text().toInt());
if(tcpClient->waitForConnected(3000))
{
ui->recev_edit->append("成功连接!");
ui->btn_connect->setText("断开");
ui->btn_send->setEnabled(true);
}
connect(tcpClient,&QTcpSocket::disconnected,[=](){
ui->btn_connect->setText("连接");
ui->btn_send->setEnabled(false);
});
}
else
{
tcpClient->disconnectFromHost();
ui->btn_connect->setText("连接");
ui->btn_send->setEnabled(false);
}
发送消息
QTcpSocket 下write函数将发送内容发送到连接好的服务器,utf8则可以传输中文。
tcpClient->write(data.toUtf8());
接收消息使用信号槽,readAll()将服务器的消息全部读取
connect(tcpClient,&QTcpSocket::readyRead,this,&MyClient::ReadDate);
void MyClient::ReadDate()
{
QByteArray buffer = tcpClient->readAll();
if(!buffer.isEmpty())
{
ui->recev_edit->append("接收 : "+buffer);
}
}
服务端
服务端的简单操作是监听,得到新链接,再与客户端进行信息交互,断开链接。
QTcpServer* TCPServer ;
QTcpSocket* TCPSocket;
QList<QTcpSocket*> tcpClient ;
监听 所有地址,与port端口,端口必须为int类型
TCPServer->listen(QHostAddress::Any, port))
监听单一地址则在,地址参数上填入QHostAddress(一个QString类型的地址参数,可使用QNetworkInterface::allAddresses()的信息遍历而得)
得到与客户端的新链接
connect(TCPServer,&QTcpServer::newConnection,this,&MyServer::newCilent);
TCPSocket = TCPServer->nextPendingConnection();
可将新连接添加到我们的列表中,后续可对指定链接操控
tcpClient<<TCPSocket;
并且,使用peerAddress(),peerPort()函数将地址端口,输入到前端复选框,供前端选择,后端作为信息交互的发送给谁的依据。
根据新的TCPSocket进行信息交互
connect(TCPSocket,&QTcpSocket::readyRead,this,&MyServer::socket_Read_Data);
将收到的信息,根据列表中的端口ip进行输出。
void MyServer::socket_Read_Data()
{
QByteArray buffer;
QString Ip_Port_buffer;
for(int i=0;i<tcpClient.length();i++)
{
buffer = tcpClient[i]->readAll();
if(buffer.isEmpty()) continue;
Ip_Port_buffer =tr("[%1:%2]接收:%3\n").arg(tcpClient[i]->peerAddress().toString().remove("::ffff:"))
.arg(tcpClient[i]->peerPort())
.arg(QString(buffer));
Updata("recv",Ip_Port_buffer);
}
}
发送代码,核心依旧是write函数
void MyServer::on_send_btn_clicked()
{
QString data = ui->sendText->toPlainText();
if(data!="")
{
QString clientIp = ui->client_comboBox->currentText().split(":")[0];
int clientPort = ui->client_comboBox->currentText().split(":")[1].toInt();
for(int i=0;i<tcpClient.length();i++)
{
if(tcpClient[i]->peerAddress().toString().remove("::ffff:")==clientIp&&tcpClient[i]->peerPort()==clientPort)
{
tcpClient[i]->write(data.toUtf8());
Updata("send","发送["+clientIp+"]:"+data.toUtf8());
}
}
}
ui->sendText->clear();
}
最终实现效果
客户端
服务器
这是源代码,免费下载 0 C币。Qt本次网络编程源码资源