QT服务器设备搜索代码

服务器端

设备搜索进程作为设备连接的先决条件,作用是搜索在这个局域网内符合要求的的设备IP。如果是自己定义的设备会在接收广播后回复当前设备的ip,这样服务器端知道设备ip。此时设备可以创建自己的tcp服务器期待与服务器建立长连接,服务器收到建立连接的请求后,选择是否建立长连接。之后设备与服务器之间就可以进行通信。
设备客户端运行后首先下发此请求包,确认设备端是否已经有了点表配置文件。如果没有,那么下一步就是给设备下发点表文件;如果设备已经有了(下发过),那么需要获取设备的某些配置信息,以便QT后续运行使用。本代码只是可以建立长连接,其他的操作需要自己定义。

.h文件

#ifndef LINKWIG_H
#define LINKWIG_H

#include <QWidget>
#include<QTcpSocket>
#include <QUdpSocket>
#include <QHostAddress>
#include<QTcpServer>

namespace Ui {
class LinkWig;
}

class LinkWig : public QWidget
{
    Q_OBJECT

public:
    explicit LinkWig(QWidget *parent = 0);
    ~LinkWig();

private slots:
    void on_pushButton_search_clicked();
    void readyReadSlot();
    void on_pushButton_link_clicked();
    void ConnectSlot();
private:
    Ui::LinkWig *ui;
    QTcpSocket *socket=NULL;//创建客户端套接字对象
    QUdpSocket *broadsocket=NULL;//创建udp套接字对象
};
#endif // LINKWIG_H

.c文件

#include "linkwig.h"
#include "ui_linkwig.h"

LinkWig::LinkWig(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LinkWig)
{
    ui->setupUi(this);
    broadsocket = new QUdpSocket(this);//创建广播套接字
    broadsocket->bind(QHostAddress::AnyIPv4, 8880, QUdpSocket::ShareAddress);

}

LinkWig::~LinkWig()
{
    delete ui;
}
//进行ip广播搜索
void LinkWig::on_pushButton_search_clicked()
{

    broadsocket->writeDatagram("this is broadcast message !", QHostAddress::Broadcast, 8880);
    connect(broadsocket, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));

}

void LinkWig::ConnectSlot()
{
    qDebug()<<"tcp连接槽函数";
}

void LinkWig::readyReadSlot()
{
    while(broadsocket->hasPendingDatagrams())
    {
        QByteArray data;
        data.resize(broadsocket->pendingDatagramSize());
        QHostAddress host;
        quint16 port;
        broadsocket->readDatagram(data.data(), data.size(), &host, &port);
        ui->plainTextEdit_add->appendPlainText(host.toString());
        ui->plainTextEdit_add->appendPlainText(QString::number(port));
        qDebug() << "Received message from" << host.toString() << ":" << data;

        // Send response back to the sender
//        QByteArray response = "Hello from device!";
//        broadsocket->writeDatagram(response, host, port);
    }

}

void LinkWig::on_pushButton_link_clicked()
{
    //拿到服务端的Ip和端口号
    socket=new QTcpSocket(this);
    QString severip=ui->ip->text();
    int port=ui->port->text().toInt();
    //TODO检测有效性
    socket->connectToHost(severip,port);
    qDebug()<<"tcp connect";
}

设备端

.h文件

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QWidget>
#include<QTcpSocket>
#include <QUdpSocket>
#include <QHostAddress>
#include<QTcpServer>
namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QTcpServer *sever;//设备创建TCP服务器

    QUdpSocket *socket;
private slots:
    readyReadSlot();
    newConnectSlot();
signals:
    void deviceFound(const QString &ipAddress, const QByteArray &response);
};

#endif // DIALOG_H

.c文件

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    socket = new QUdpSocket(this);
    if(!socket->bind(8880, QUdpSocket::ShareAddress))
    {
        ui->textBrowser->append("bind failed !");
    }
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyReadSlot()));




}

Dialog::~Dialog()
{
    delete ui;
}

Dialog::readyReadSlot()
{
    while(socket->hasPendingDatagrams())
    {
        QByteArray data;
        data.resize(socket->pendingDatagramSize());
        QHostAddress host;
        quint16 port;
        socket->readDatagram(data.data(), data.size(), &host, &port);
        QString text = QString("[%1:%2]:%3").arg(host.toString()).arg(port).arg(QString(data));
        ui->textBrowser->append(text);
        QByteArray response = "Hello from device!";
        socket->writeDatagram(response, host, port);
    }

    //创建TCP服务器
    sever=new QTcpServer(this);//构造函数创建服务器对象
    bool result=sever->listen(QHostAddress::Any,8880);
    if(!result)
    {
        ui->textBrowser->append("listen failure");
        return 0;
    }
    ui->textBrowser->append("listen success,");
    connect(sever,SIGNAL(newConnection()),this,SLOT(newConnectSlot()));

}

Dialog::newConnectSlot()
{
//    socket=sever->nextPendingConnection();//获得当前连接过来的客户端信息
    //获取ip,port
    QString ip=socket->peerAddress().toString();
    quint16 port=socket->peerPort();
    ip.prepend("ip:").append("port:").append(QString::number(port));
    ui->textBrowser->append(ip);
    ui->textBrowser->append("Start Connect");
}

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值