0
点赞
收藏
分享

微信扫一扫

TCP/UDP---Qt

醉东枫 2022-03-11 阅读 53
qtudptcp/ip

功能在widget工程里面实现
准备工作
在 .pro 文件里加上

QT += network

TCP

服务端

#include <QTcpServer>
#include <QTcpSocket>

1、定义监听socket和接收消息socket

    QTcpServer* server;
    QTcpSocket* socket;

2、在构造函数里进行初始化

	server = new QTcpServer();
    connect(server,&QTcpServer::newConnection,this,&ServerMainWindow::handleNewConnect);
    if(!server->listen(QHostAddress::Any,9966))
    {
        ui->labelRecvData->setText(server->errorString());
    }

3、添加发送消息和接收消息的函数

void ServerMainWindow::handleNewConnect()
{
    socket = server->nextPendingConnection();
    connect(socket,&QTcpSocket::readyRead,this,&ServerMainWindow::recvData);
    connect(socket,&QTcpSocket::disconnected,this,&ServerMainWindow::handleDisconnect);
}

void ServerMainWindow::recvData()
{
    QByteArray buffer;
    buffer = socket->readAll();
    if(!buffer.isEmpty())
    {
        ui->labelRecvData->setText(QString(buffer));
    }
}

void ServerMainWindow::handleDisconnect()
{
    ui->labelRecvData->setText("Client disconnected");
}

void ServerMainWindow::on_pushButtonSendData_clicked()
{
    QString qstrSend = ui->lineEditSendData->text();
    socket->write(qstrSend.toUtf8());
    socket->flush();
}

客户端

#include <QTcpSocket>

1、添加socket

    QTcpSocket* socket;

2、在构造函数里面初始化

	socket = new QTcpSocket();
    socket->connectToHost("10.30.16.254",9966);
    if(!socket->waitForConnected(3000))
    {
        qDebug()<<"Connect fail"<<endl;
    }
    else
    {
        socket->write("hello");
        socket->flush();
        connect(socket,&QTcpSocket::readyRead,this,&MainWindowClient::recvData);
    }

3、添加发送消息和接收消息函数

void MainWindowClient::recvData()
{
    QByteArray buffer;
    buffer = socket->readAll();
    if(!buffer.isEmpty())
    {
        ui->labelRecvData->setText(QString(buffer));
    }
}

void MainWindowClient::on_pushButtonSendData_clicked()
{
    QString qstrSendData = ui->textEditSendData->toPlainText();
    if(!qstrSendData.isEmpty())
    {
        socket->write(qstrSendData.toUtf8());
        socket->flush();
    }
}

UPD

对于UDP而言,不区分客户端和服务端,因为每个socket都既可以广播消息也可以接收消息

#include <QUdpSocket>

1、添加socket

    QUdpSocket* socket;

2、在构造函数里初始化

	socket = new QUdpSocket();
    socket->bind(8909,QUdpSocket::ShareAddress);
    connect(socket,&QUdpSocket::readyRead,this,&MainWindowUDPServer::recvData);

3、添加广播消息和发送消息函数

//读数据报
void MainWindowUDPServer::recvData()
{
    while(socket->hasPendingDatagrams())
    {
        QByteArray dataGrams;
        dataGrams.resize(socket->pendingDatagramSize());
        QHostAddress address;
        quint16 port;
        socket->readDatagram(dataGrams.data(),dataGrams.size(),&address,&port);
        qDebug()<<address<<port<<endl;

        QDataStream stream(dataGrams);
        QString qstrData1,qstrData2;
        stream>>qstrData1>>qstrData2;
        ui->labelRecvData->setText(qstrData1);
    }
}

void MainWindowUDPServer::on_pushButtonSendDataGram_clicked()
{
    QByteArray byteArray;
    QDataStream stream(&byteArray,QIODevice::WriteOnly);
    stream<<ui->textEditSendDataGram->toPlainText();
    socket->writeDatagram(byteArray,QHostAddress::Broadcast,8909);
}

觉得博客对你有帮助的话:
在这里插入图片描述

举报

相关推荐

UDP/TCP

TCP/UDP

图解TCP/UDP

TCP与UDP

UDP/TCP协议

TCP和UDP

0 条评论