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函数。