Qt Socket网络编程

实现多客户端单服务器通信

客户端

利用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本次网络编程源码资源

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值