网盘——客户端服务器搭建

1、配置文件加载

资源文件

将服务器IP和PORT信息填入配置文件中

将配置文件作为资源文件添加到资源文件中

程序运行时加载配置文件中的数据

1.1、首先在创建好的代码目录下面创建一个配置文件

代码目录怎么找到的呢?

1.2、在这个路径下面,创建一个 文本文件,将ip和端口号写进去

1.3、将该文件作为资源文件添加进来

A、右键项目,Add New或者直接Ctrl+N

B、点击Qt——Qt Resource File——点击choose

C、写上自己的名称

D、将配置文件添加到项目里面来

 1.4、使用QFile头文件,通过QFile产生类对象,打开文件

 QFile file(":/client.config");

1.5、打开之后将所有的数据读取出来,转换成字符串

QByteArray baData = file.readAll()

 1.6、将换行\r\n等用空格进行替换

strData.replace("\r\n", " ");

1.7、使用空格对文本进行剪切

        //按照空格进行切分--是一个字符串列表
        QStringList strList =  strData.split(" ");

1.8、将ip和端口号放到成员变量里面来

 m_strIP = strList.at(0);
 //端口现在是字符串,现在得转换成无符号的整型
m_usPort = strList.at(1).toUShort();

总的代码

void TcpClient::loadConfig()
{
    QFile file(":/client.config");
    if(file.open(QIODevice::ReadOnly)){
        QByteArray baData = file.readAll();
        //将字节转换成字符串
        //c_str()将首地址转换成char*类型的
        QString strData = baData.toStdString().c_str();
        //        qDebug()<<strData;
        file.close();

        //切分字符串
        strData.replace("\r\n", " ");
        //qDebug()<<strData;
        //按照空格进行切分--是一个字符串列表
        QStringList strList =  strData.split(" ");
        //切分完成之后打印一下
        //        for(int i=0; i<strList.size(); i++){
        //            qDebug()<<"------>"<<strList[i];
        //        }

        m_strIP = strList.at(0);
        //端口现在是字符串,现在得转换成无符号的整型
        m_usPort = strList.at(1).toUShort();
        qDebug()<<"ip"<<m_strIP <<"port"<<m_usPort;
    }
    else {
        QMessageBox::critical(this, "open config", "open config failed");
    }
}

备注:

A、记得在.h文件里面的私有变量里面定义成员变量

    QString m_strIP;
    quint16 m_usPort;

B、在.h文件public里定义函数

void loadConfig();

C、在.cpp文件里面调用定义的函数,要不然不现实的哦

loadConfig();

2、产生socket

通过m_tcpSocket连接服务器,与服务器之间进行数据交互

2.1、在.h头文件里面引入QTcpSocket, 通过TCPsocket来连接服务器和收发服务器数据

#include <QTcpSocket>

2.2、在.h文件下创建私有对象

QTcpSocket m_tcpSocket;

2.3、在构造函数里面直接进行服务器连接

这里使用了QHostAddress对象,所以也得引用头文件

#include <QHostAddress>
//连接服务器
    m_tcpSocket.connectToHost(QHostAddress(m_strIP), m_usPort);

2.4、查看是否发送成功

A、在头文件添加槽函数

public slots:
    //查看是否服务器连接成功
    void showConfig();

B、在cpp里面添加定义

void TcpClient::showConfig()
{
    QMessageBox::information(this, "连接服务器", "连接服务器成功");
}

C、将信号和信号的处理函数关联起来connect

信号的的发送者m_tcpSocket,发出连接的信号,信号的接收方,用showConfig()函数来处理。

后面只要发送这个信号,他就会调用showConfig()函数来处理

 connect(&m_tcpSocket, SIGNAL(connected()), this, SLOT( showConfig()));v

3、写服务器

新建一个项目TcpServer

3.1、首先跟上面一样,进行配置文件的加载

3.2、监听——通过TcpServer来监听

QTcpServer派生,监听及接收客户端的连接

QTcpServer派生, 和客户端数据交互

A、继承TCpServer,产生一个派生类

B、在mytcpserver.h里面引入头文件

#include <QTcpServer>

注意:为了让他支持信号槽,必须在类的最开始写Q_OBJECT,作为QTcpServer的基类

class MyTcpServer : public QTcpServer
{
    //为了让他支持信号槽,必须在类的最开始写Q_OBJECT,作为QTcpServer的基类
    Q_OBJECT
public:

    MyTcpServer();
}

C、定义一个单例模式,写一个静态的成员函数,这个成员函数返回值是MyTcpServer的引用,函数命叫做getInstance

//单例模式
    static MyTcpServer &getInstance();

D、添加函数定义 

到后面凡是需要用到MyTcpServer的时候,直接通过类名getInstance获得静态的局部对象来进行操作,无论调用多少次,有且仅有一个对象

MyTcpServer &MyTcpServer::getInstance()
{
    //到后面凡是需要用到MyTcpServer的时候,直接通过类名getInstance获得静态的局部对象来进行操作,无论调用多少次,有且仅有一个对象
    static MyTcpServer instance;
    return instance;
}

E、在mytcpserver产生的对象,然后在tcpserver用这个对象来监听和接收客户端的连接

MyTcpServer::getInstance().listen(QHostAddress(m_strIP), m_usPort);

F、Tcpserver监听之后,怎么直到监听成功了呢?一旦有客户端过来,他就会自动去调用incomingConnection

函数定义

void incomingConnection(qintptr socketDescriptor);
void MyTcpServer::incomingConnection(qintptr socketDescriptor)
{
    //只要有客户端连接过来了就打印一下
    qDebug()<<"new client connected";
}

G、运行一下,只要有客户端连接过来了,那么我们就打印一下

4、总结

加载配置文件之后,在客户端产生一个socket,通过socket连接服务器,成功连接服务器会发出connected()信号,通过槽函数,借此判断是否成功连接服务器。

服务器跟客户端不一样,他首先需要有一个TcpServer进行监听,在监听之前,先加载配置文件,之后使用MyTcpServer进行监听,只要客户端有连接过来的话,就会自动调用incomingConnection函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值