QT——C++ 网络编程04

一、导入pro依赖

在这里插入图片描述

二、例子

(一)完整程序运行图

在这里插入图片描述

(二)核心代码

  • 头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <qtcpserver.h>



class Login;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    void initUI();
    void initConnect();

    /**
     * @brief 网络编程服务端测试
     */
    void networkServerTest();

    /**
     * @brief 客户端
     */
    void networkClientTest();

private:
    Ui::MainWindow *ui;
    Login *login;
    QTcpServer *server;
    QTcpSocket *client;

    QMap<QString,QTcpSocket *> *session;

};

#endif // MAINWINDOW_H

  • 源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
#include <QPaintEvent>
#include <QTcpServer>
#include <QTcpSocket>
#include <QMessageBox>
#include <QMap>
#include <QStringListModel>

//其他页面的依赖
#include "login.h"

//操作数据库的依赖
#include "sqlutil.h"

//登录处理器
#include "handle/loginhandle.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    //这个表示对属性ui进行初始化 初始值为:new Ui::MainWindow。用逗号分割,后面可以初始化很多属性
    ui(new Ui::MainWindow),
    //初始化login属性
    login(new Login())
{
    ui->setupUi(this);
    initUI();
    initConnect();

    //网络会话管理
    session = new QMap<QString,QTcpSocket *>();

    networkServerTest();
    networkClientTest();
}

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

void MainWindow::initUI()
{
    if(LoginHandle::getLoginHandle()->isLogin()){
        ui->goLogin->hide();
        ui->userCenter->show();
        ui->logout->show();
        ui->userCenter->setText(LoginHandle::getLoginHandle()->getUserInfo().getUserName());
    }else {
        ui->goLogin->show();
        ui->logout->hide();
        ui->userCenter->hide();
    }

}
void MainWindow::initConnect()
{
    //显示登录界面
    connect(ui->goLogin,&QPushButton::clicked,[=]{
        //显示login页面
         login->show();
    });


    //退出登录
    connect(ui->logout,&QPushButton::clicked,[=]{
        LoginHandle::getLoginHandle()->logout();
        initUI();
    });

    //启动服务器
    connect(ui->startServer,&QPushButton::clicked,[=]{
        //获取端口号
        if(ui->serverPort->text()==""){
            QMessageBox::information(this, "提示", "端口不能为空",QMessageBox::Ok);
        }else {
            int port = ui->serverPort->text().toInt();
            //让服务器监听端口
            bool isListening = server->listen(QHostAddress::LocalHost,port);
            if(isListening){
                ui->stopServer->setEnabled(true);
                ui->startServer->setEnabled(false);
                ui->serverPort->setEnabled(false);
                ui->timeout->setEnabled(false);
                ui->textServer->append(">>服务器启动成功");
            }else {
                ui->textServer->append(">>服务器启动失败");
                qDebug()<< server->errorString();
            }
        }
    });

    //停止服务
    connect(ui->stopServer,&QPushButton::clicked,[=]{
        if(server->isListening()){
            server->close();
            ui->stopServer->setEnabled(false);
            ui->startServer->setEnabled(true);
            ui->serverPort->setEnabled(true);
            ui->timeout->setEnabled(true);
            ui->textServer->append(">>服务器已停止运行");
        }else {
            ui->textServer->append(">>服务器未停止运行");
        }
    });

    //连接服务器
    connect(ui->linkServer,&QPushButton::clicked,[=]{

        QString ip = ui->ip->text();
        int port = ui->port->text().toInt();
        if(ip==""||ui->port->text()==""){
            QMessageBox::information(this, "提示", "不能为空",QMessageBox::Ok);
        }else {
            client->connectToHost(ip,port);
        }
    });

    //关闭连接
    connect(ui->closeLink,&QPushButton::clicked,[=]{
        client->close();
    });

    //客户端给服务端发送数据
    connect(ui->send,&QPushButton::clicked,[=]{
        QString msg = ui->msgBody->toPlainText();

        if(client->isOpen()){
            client->write(msg.toUtf8());
        }else {
            qDebug()<< "连接已断开";
        }

    });

    //服务端给客户端发送消息。
//    QTcpSocket *tcpLink = session->value("127.0.0.1");
//    if(tcpLink!=nullptr){
//        if(tcpLink->isOpen()){
//            tcpLink->write(msg.toUtf8());
//        }else {
//            qDebug()<< "连接已断开";
//        }
//    }else {
//        qDebug()<< "空";
//    }


    //清空接收的消息
    connect(ui->clearClient,&QPushButton::clicked,[=]{
        ui->textClient->clear();
    });
    connect(ui->clearServer,&QPushButton::clicked,[=]{
        ui->textServer->clear();
    });

}


/**
 * @brief   网络编程服务端测试
 */
void MainWindow::networkServerTest()
{
    //创建服务器
    server = new QTcpServer();

    //当有新的连接接入服务器时触发回调函数。
    connect(server, &QTcpServer::newConnection, [=]{
        QTcpSocket *tcpLink = server->nextPendingConnection();

        //将连接会话存储起来,方便调用。
        QString key = tcpLink->peerAddress().toString();
        session->insert(key,tcpLink);

        //连接服务器的主机的地址
        qDebug()<< tcpLink->peerAddress();
        //连接服务器的主机名
        qDebug()<< tcpLink->peerName();
        //连接主机的端口
        qDebug()<< tcpLink->peerPort();
        // 检测是否有客户端数据
        connect(tcpLink, &QTcpSocket::readyRead, this, [=]()
        {
            // 接收数据
            QByteArray msg= tcpLink->readAll();
            ui->textServer->append(msg);

        });
        // 客户端断开了连接
        connect(tcpLink, &QTcpSocket::disconnected, this, [=]()
        {
            ui->textServer->append(">>客户端断开连接");
        });
    });
    //当连接发生错误时触发
    connect(server,&QTcpServer::acceptError,[=](QAbstractSocket::SocketError socketError){
        //socketError 一个枚举,有很多类型,可以自己查看
        if(socketError==QAbstractSocket::SocketError(1)){
            qDebug()<< "发生错误";
        }
    });
}

/**
 * @brief 客户端
 */
void MainWindow::networkClientTest()
{
    client = new QTcpSocket();
    // 连接成功服务器
    connect(client, &QTcpSocket::connected, [=]{
        ui->textClient->append(">>成功连接服务器");
        ui->linkServer->setEnabled(false);
        ui->closeLink->setEnabled(true);

        ui->ip->setEnabled(false);
        ui->port->setEnabled(false);
    });

    connect(client, &QTcpSocket::readyRead, [=](){
        // 接收数据
        QByteArray msg= client->readAll();
        ui->textClient->append(msg);
    });

    //断开连接
    connect(client, &QTcpSocket::disconnected,  [=](){
        ui->textClient->append(">>连接已断开");
        ui->linkServer->setEnabled(true);
        ui->closeLink->setEnabled(false);
        ui->ip->setEnabled(true);
        ui->port->setEnabled(true);
    });

    //调用connectToHost()后主机查找成功后发出。
    connect(client, &QTcpSocket::hostFound, [=](){
        ui->textClient->append(">>连接的服务器存在,等待建立连接");
    });

    //连接发送错误时


}

(三)完整代码

代码路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值