Qt服务器端与客户端交互

Qt做客户端与服务器端交互第一步引入network

第一步引入network后继续编程首先界面设计

创建server和socket

引入QTcpServer,QTcpSocket

MainWindow.h代码如下

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QTcpServer *tcpserver;
    QTcpSocket *tcpsocket;
    QList<QTcpSocket*> listClient;
    void onButtonClicked();
    void onButtonClicked1();
private slots:
    void on_connectbt_clicked();
    void on_disconnectbt_clicked();
    void on_sendbt_clicked();
    void newConnection_Slot();
    void readyRead_Slot();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

然后绑定IP和端口号:

复制代码
tcpserver->listen(QHostAddress::Any,ui->portnum->text().toUInt());//监听端口号
复制代码
    qDebug()<<"服务器已经打开;端口号是"<<ui->portnum->text();
复制代码
tcpserver=new QTcpServer(this);
复制代码
    tcpsocket=new QTcpSocket(this);
复制代码
    connect(tcpserver,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));

服务器端代码MainWindow.cpp如下,包括socket连接,读,写

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QComboBox>
#include<QLineEdit>
#include<QPushButton>
#include<QTcpSocket>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tcpserver=new QTcpServer(this);
    tcpsocket=new QTcpSocket(this);
    connect(tcpserver,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::on_sendbt_clicked);
    connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::on_connectbt_clicked);
    connect(ui->pushButton_3, &QPushButton::clicked, this, &MainWindow::on_disconnectbt_clicked);
    connect(ui->pushButton_4, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
    connect(ui->pushButton_5, &QPushButton::clicked, this, &MainWindow::onButtonClicked1);
    //connect(ui->pushButton_3, &QPushButton::clicked, this, &MainWindow::on_disconnectbt_clicked);
}
//单发命令

void MainWindow::newConnection_Slot(){

    tcpsocket=tcpserver->nextPendingConnection();
    listClient.append(tcpsocket);
    qDebug() << listClient.count();
        //qDebug() << tcpsocket;
    ui->comboBox->addItem("客户端"+QString::number(listClient.count())+"号");
    //for(int i=0;i<listClient.count();i++)
    //{

        //tcpsocket=listClient.at(i);
        qDebug()<<tcpsocket;
        //connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));
        connect(tcpsocket, &QTcpSocket::readyRead,
                 [=]()
                 {
                  //从通信套接字中取出内容
            QString buf;
            buf=tcpsocket->readAll();
            ui->receivewd->append(buf);
                 }
                 );
    //}
}
void MainWindow::readyRead_Slot()
{
    //第四步:读取套接字的内容
    //从socket中读出数据
     QString buf;
     buf=tcpsocket->readAll();
     ui->receivewd->append(buf);

     /*或
     QByteArray baArray = tcpsocket->readAll();
     QString sMsg = baArray;
     ui->receivewd->appendPlainText(receivewd);
     */
}
void MainWindow::on_connectbt_clicked()//连接服务器
{
    //第二部步:listen------监听是否有新的连接进来
    tcpserver->listen(QHostAddress::Any,ui->portnum->text().toUInt());//监听端口号
    qDebug()<<"服务器已经打开;端口号是"<<ui->portnum->text();
}
void MainWindow::on_disconnectbt_clicked()//关闭服务器
{
    tcpserver->close();
}

void MainWindow::on_sendbt_clicked()//发送信息
{
//    toLatin1()
//    tcpsocket->write(ui->sendwd->text().toLatin1());
//    tcpsocket->write(ui->sendwd->text().toLocal8Bit(),ui->sendwd->text().length());
    for(int i=0;i<listClient.count();i++)
    {
        tcpsocket=listClient.at(i);
    tcpsocket->write(ui->sendwd->text().toLocal8Bit().data());
    }
}
MainWindow::~MainWindow()
{
    delete ui;
}

客户端代码如下:客户端界面

MainWindow.h文件:

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QTcpSocket *tcpsocket;
private slots:
    void on_openclient_clicked();
    void connected_SLOT();
    void readyRead_Slot();
    void on_closeclient_clicked();
    void on_sent_clicked();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

客户端代码MainWindow.cpp

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tcpsocket=new QTcpSocket(this);
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::on_sent_clicked);
    connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::on_openclient_clicked);
    connect(ui->pushButton_3, &QPushButton::clicked, this, &MainWindow::on_closeclient_clicked);
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::connected_SLOT()
{
    QObject::connect(tcpsocket, &QTcpSocket::readyRead, this, &MainWindow::readyRead_Slot);
//    connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));//将信号连接到槽,书写比较明确

}
void MainWindow::readyRead_Slot()//定义接收信号的槽
{
    QString buf;
    buf=tcpsocket->readAll();
    int num=buf.toInt();
    switch(num){
    case 1:
        break;
    }
    ui->receivewd->append(buf);//接收由tcp发送过来的信息
//    ui->receivewd->appendPlainText(buf.toUtf8());//接收由tcp发送过来的信息
}


void MainWindow::on_openclient_clicked()
{
    //第一步:创建套接字,与服务端的IP地址和端口号连接.
    //注:这里的端口号和上面服务端绑定的那个端口号是一样的,别搞错了.
    //连接服务端
    tcpsocket->connectToHost(ui->ipnum->text(),ui->portnum->text().toInt());//转为无符号,连接服务器端口
    connect(tcpsocket,SIGNAL(connected()),this,SLOT(connected_SLOT()));
    qDebug() << "连接服务器端成功IP是"<<ui->ipnum->text()<<"端口号是:"<<ui->portnum->text();

    /*
    //成功连接返回true,错误返回false
    if(m_tsTcpSocket->waitForConnected())
    {
        qDebug() << "connect success";
    }
    */
}

void MainWindow::on_closeclient_clicked()
{
    tcpsocket->close();
    printf("关闭客户端 ");
}

void MainWindow::on_sent_clicked()
{
    tcpsocket->write(ui->sendwd->text().toLocal8Bit().data(),ui->sendwd->text().length());//丽丽
}

客户端与服务器端交互,主要就是连接,读和写内容。

相关推荐
Larry_Yanan8 小时前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
刺客xs15 小时前
Qt ----- QT线程
开发语言·qt
SunkingYang18 小时前
QT程序如何将事件和消息发送给MFC程序,MFC程序如何接收消息和事件
qt·mfc·消息·事件·通信·通讯·传递
凯子坚持 c20 小时前
Qt 5.14.0 入门框架开发全流程深度解析
开发语言·qt
深蓝海拓20 小时前
PySide6从0开始学习的笔记(十四)创建一个简单的实用UI项目
开发语言·笔记·python·qt·学习·ui·pyqt
小尧嵌入式20 小时前
Linux网络介绍网络编程和数据库
linux·运维·服务器·网络·数据库·qt·php
海涛高软21 小时前
Qt中使用QListWidget列表
开发语言·qt
010米粉01021 小时前
Qt之构建方式
qt
凯子坚持 c1 天前
Qt 信号与槽机制深度解析
开发语言·qt
世转神风-1 天前
qt-初步编译运行报错-When executing step “Make“-无法启动进程“make“
开发语言·qt