Qt建立服务端和客户端

一. C语言中

1. 服务器端流程Server

        1. 创建套接字--socket()

        2.将套接字与其ip地址,端口号进行绑定--bind()

        3. 将套接字设置成被动监听状态--listen()

        2和3是Qt中的listen(),1,2和3实质就是把自己的信息固定下来,等待别人与之通信

        4. 阻塞等待客户端的连接请求--accept()

        5. 进行通信 1)recv(),read()接收数据 send() write()发送数据

        6. 关闭套接字--close()

2. 客户端流程Client

        1. 创建套接字--socket()

        绑定ip及端口号(可选),此步可以随机让系统产生.

        2. 发送客户端的连接请求--connect()

        3, 进行通信 recv() read() 接收数据

        send() write() 发送数据

        4. 关闭套接字--close()

二. Qt中

1. 服务器端流程Server

  1. 创建套接字服务器 QTcpServer 对象

  2. 通过 QTcpServer 对象设置监听,即:QTcpServer::listen()

  3. 基于 qTcpserver::newconnection()信号检测是否有新的客户端连接

  4. 如果有新的客户端连接调用 QTcpSocket *QTcpserver::nextPendingconnection()得到通信的套接字对象

  5. 使用通信的套接字对象 QTcpSocket和客户端进行通信

    #include "widget.h"
    #include "ui_widget.h"
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
        this->setWindowTitle("服务器");
        server = new QTcpServer(this);
        connect(server,&QTcpServer::newConnection,[=](){
            socket = server->nextPendingConnection();
            ui->checkroomTex->append("与客户建立了联接...");
            connect(socket,&QTcpSocket::readyRead,[=](){
                QString recMeg = socket->readAll();
                ui->checkroomTex->append("客户端输出:"+recMeg);
            });
            connect(socket,&QTcpSocket::disconnected,[=](){
                ui->checkroomTex->append("客户端断开了连接");
                socket->deleteLater();
            });
        });
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    
    void Widget::on_startBtn_clicked()
    {
        int port = ui->port->text().toInt();
        server->listen(QHostAddress::Any,port);
        ui->startBtn->setEnabled(false);
    
    }
    
    void Widget::on_senderBtn_clicked()
    {
        QString sendMsg = ui->senderTex->toPlainText();
        socket->write(sendMsg.toUtf8());
        ui->checkroomTex->append("服务器端输出:"+sendMsg);
        ui->senderTex->clear();
    }
    

2. 客户端流程Client

        1)创建通信的套接字类QTcpSocket对象

        2)使用服务器端绑定的IP和端口连接服务器QAbstractSocket::connectToHost()

        3)使用QTcpSocket对象和服务器进行通信

#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("客户端");
    //建立套接字
    socket = new QTcpSocket(this);
    //确认是否已经连接成功
    connect(socket,&QTcpSocket::connected,[=](){
        ui->checkroomTex->append("与服务器连接成功");
    });
    connect(socket,&QTcpSocket::readyRead,[=](){
        QString recMsg = socket->readAll();
        ui->checkroomTex->append("服务器输出"+recMsg);
    });
    connect(socket,&QTcpSocket::disconnected,[=](){
        ui->checkroomTex->append("服务器断开了");
        ui->linkserverBtn->setEnabled(true);
        ui->disconnectBtn->setEnabled(false);
    });
}

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


void Widget::on_linkserverBtn_clicked()
{
    QString ip = ui->address->text();
    unsigned int port = ui->port->text().toUInt();

    socket->connectToHost(QHostAddress(ip),port);

    ui->linkserverBtn->setEnabled(false);
    ui->disconnectBtn->setEnabled(true);


}

void Widget::on_senderBtn_clicked()
{
    QString sendMsg = ui->senderTex->toPlainText();
    socket->write(sendMsg.toUtf8());
    ui->checkroomTex->append("客户端输出"+sendMsg);
    ui->senderTex->clear();
}

void Widget::on_disconnectBtn_clicked()
{
    socket->close();
    ui->linkserverBtn->setEnabled(true);
    ui->disconnectBtn->setEnabled(false);
}

Qt是一个跨平台的C++应用程序框架,它提供了丰富的库和工具来帮助开发创建各种类型的应用程序,包括网络通信应用。 在Qt中实现TCP服务端客户端的通信非常简单。首先,我们需要创建一个QTcpServer对象来作为服务端,该对象负责监听客户端的连接请求。接下来,我们需要为QTcpServer对象绑定一个IP地址和端口号,以便客户端能够连接到该地址和端口。当有新的客户端连接时,QTcpServer对象会发出newConnection()信号。 在服务端的槽函数中,我们可以使用QTcpServer的nextPendingConnection()函数获取新连接的QTcpSocket对象,该对象用于和客户端进行通信。我们可以在该对象上发送和接收数据,以实现服务端客户端之间的数据交互。 接下来,我们需要创建一个QTcpSocket对象作为客户端,该对象负责和服务端建立连接。我们需要使用connectToHost()函数来指定要连接的服务端的IP地址和端口号。一旦连接成功,QTcpSocket对象会发出connected()信号。 在客户端的槽函数中,我们可以使用QTcpSocket对象发送和接收数据。我们可以使用write()函数发送数据,使用readyRead()信号和read()函数接收数据。 通过这种方式,我们可以在服务端客户端之间进行双向的数据通信。服务端可以同时接受多个客户端的连接,每个客户端都可以和服务端进行独立的数据交互。 总的来说,使用Qt实现TCP服务端客户端通信非常方便。通过使用QTcpServer和QTcpSocket类,我们可以轻松地建立连接,发送和接收数据。这种通信方式可以应用于多种场景,如实时聊天、远程控制等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值