• 2407阅读
  • 2回复

[提问]Qt使用UDP来做的C/S模型,Client只能发送但是收不到服务器发来的消息 [复制链接]

上一主题 下一主题
离线lirichard
 

只看楼主 倒序阅读 楼主  发表于: 2019-08-22
如题,这是服务器端


关键代码如下:
  1. void Server::on_start_btn_clicked()
  2. {
  3.     qDebug()<<getIPAddress();
  4.     QString ip = getIPAddress();
  5.     qDebug()<<"本机IP地址为 "<<ip;
  6.     this->server = new QUdpSocket(this);
  7.     this->server->bind(QHostAddress(ip),8080);
  8.     connect(server,SIGNAL(readyRead()),this,SLOT(recv_data()));
  9.     ui->start_btn->setEnabled(false);
  10. }
  11. void Server::recv_data()
  12. {
  13.     QByteArray b_buffer;
  14.     QHostAddress clientAddr;
  15.     quint16 port;
  16.     while (server->hasPendingDatagrams())
  17.     {
  18.         b_buffer.resize(static_cast<int>(server->pendingDatagramSize()));
  19.         server->readDatagram(b_buffer.data(),b_buffer.size(),&clientAddr,&port);
  20.     }
  21.     qDebug()<<QString(b_buffer);;
  22.     parseData(clientAddr.toString(),port,QString(b_buffer));
  23. }
  24. void Server::parseData(const QString& IP,const quint16& port,const QString& data)
  25. {
  26.     qDebug()<<QString("收到来自 %1 端口号为 %2 的客户端的消息:%3").arg(IP).arg(port).arg(data);
  27.     QStringList parameters_list = data.split("&");
  28.     if(parameters_list.at(0)=="200")
  29.     {
  30.         qDebug()<<QString("客户端请求注册,注册信息为 用户名:%1,密码:%2").arg(parameters_list.at(1)).arg(parameters_list.at(2));
  31.         qint64 len = server->writeDatagram(QByteArray("1"),QHostAddress(IP),port);
  32.         qDebug()<<len;
  33.     }
  34. }
这是客户端:

关键代码:
  1. Register::Register(QWidget *parent) :
  2.     QDialog(parent),
  3.     ui(new Ui::Register)
  4. {
  5.     ui->setupUi(this);
  6.     this->setWindowFlag(Qt::FramelessWindowHint);
  7.     this->loadStytleSheet(":/myresources/register.qss");
  8.     client = new QUdpSocket(this);
  9.     if(!client->bind(8080,QUdpSocket::ShareAddress))
  10.     {
  11.         qDebug()<<"failed to bind port!";
  12.     }
  13.     connect(client,SIGNAL(readyRead()),this,SLOT(recv_data()));
  14. }
  15. void Register::on_confirm_btn_clicked()
  16. {
  17.     bool account = true,password = true,confirm_psw = true,compare = true;
  18.     if(ui->account_input->text().isEmpty())
  19.     {
  20.         account = false;
  21.         ui->account_label->setText("账号不能为空!");
  22.         return;
  23.     }
  24.     ui->account_label->setText("");
  25.     if(ui->psw_input->text().isEmpty())
  26.     {
  27.         password = false;
  28.         ui->psw_label->setText("密码不能为空!");
  29.         return;
  30.     }
  31.     ui->psw_label->setText("");
  32.     if(ui->confirm_input->text().isEmpty())
  33.     {
  34.         confirm_psw = false;
  35.         ui->confirm_label->setText("请输入确认密码!");
  36.         return;
  37.     }
  38.     ui->confirm_label->setText("");
  39.     if(ui->psw_input->text()!=ui->confirm_input->text())
  40.     {
  41.         compare = false;
  42.         ui->confirm_label->setText("两次输入的密码不相同!");
  43.         return;
  44.     }
  45.     ui->confirm_label->setText("");
  46.     if(account&&password&&confirm_psw&&compare)
  47.     {
  48.         this->info.account = ui->account_input->text();
  49.         this->info.password = ui->psw_input->text();
  50.         this->info.signature = ui->signature_input->toPlainText();
  51.        if(this->info.is_valid())
  52.        {
  53.            QString data = QString("200&%1&%2").arg(info.account).arg(info.password);
  54.            qDebug()<<"注册信息为 "<<data;
  55.            qint64 len = client->writeDatagram(data.toUtf8(),QHostAddress("118.25.130.135"),8080);
  56.            qDebug()<<len;
  57.            //等待1s
  58.             Sleep(1000);
  59.            if(this->flag)
  60.            {
  61.                qDebug()<<"注册成功!"<<endl;
  62.                emit sendData(this->info);
  63.                this->on_close_btn_clicked();
  64.            }
  65.            else
  66.            {
  67.                 qDebug()<<"无法连接服务器或注册信息错误!"<<endl;
  68.            }
  69.        }
  70.        else
  71.        {
  72.             qDebug()<<"注册信息有误,请重新填写!";
  73.        }
  74.     }
  75. }
  76. void Register::recv_data()
  77. {
  78.     QByteArray buffer;
  79.     while (client->hasPendingDatagrams())
  80.     {
  81.             buffer.resize(static_cast<int>(client->pendingDatagramSize()));
  82.             client->readDatagram(buffer.data(),buffer.size());
  83.     }
  84.     QString s_buffer = QString(buffer);
  85.     qDebug()<<"收到来自服务器的消息";
  86.     if(s_buffer=="1")
  87.     {
  88.         this->flag = true;
  89.     }
  90.     else
  91.     {
  92.         this->flag = false;
  93.     }
  94. }
不知道哪出了问题,客户端的readyRead()信号就是触发不了,但是服务器端真真确确地往客户端发送了数据


求助各位大佬。。。。
离线fsu0413

只看该作者 1楼 发表于: 2019-08-23
    while (client->hasPendingDatagrams())

这里应该把后面的处理放到while里
离线小韩老师

只看该作者 2楼 发表于: 2019-08-23
一般网络调试,需要网络抓包工具比如wareshark
1.首先你在服务端电脑抓到服务发送出来的数据;
2.在客户端电脑也抓到了服务器发送的数据;
3.上述都没问题,查看网络网络设置有问题,你看看是不是电脑有多网卡,或者多个虚拟网卡等?
4.如果上述没有问题,那就是代码设置了,客户端可以尝试同时绑定IP和端口(不使用直接绑定端口,QT也不一定是绝对正确的)
5、祝你好运了
快速回复
限100 字节
 
上一个 下一个