本人并不是专业学做qt的只是公司的一个项目而接触qt。现在还没有计划开始学qt,可能是由于想学的太多了把。
我现在主要要做一个tcp客户端可以往服务器上发送数据然后接收服务器返回的数据。借鉴了一下公司以前大神的程序吧。慢慢摸索一下关于qt搭建一个客户端的知识。
使用qt做一个tcp客户端还是非常简单的。简单到无脑。
1.首先包含头文件#include <QtNetwork>因为我们要使用其中重要的类QTcpSocket。那么我们来建立一个对象tcpClient。其实看了很多的c++思想的实现,我们每添加一个功能都要构件自己的类用它的构造函数来初始化。某些工作。
class my_text_socket: public QObject
{
Q_OBJECT
public:
explicit my_text_socket(QObject *parent = NULL);
int connect_to_server();
int disconnect_from_server();
signals:
public slots:
void tcpClientConnected();
void tcpClientError(QAbstractSocket::SocketError socketError);
void tcpClientReadMsg();
private:
QTcpSocket tcpClient;
QString ip;
int port;
};
这里是我封装的结构是借鉴公司的前辈的,虽然写这段程序的大神早走了。
2.构造函数中我们要对qtcpsocker的信号提供必要的槽。
my_text_socket::my_text_socket(QObject *parent) :
QObject(parent)
{
connect(&tcpClient, SIGNAL(connected()), this, SLOT(tcpClientConnected()));
connect(&tcpClient, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(tcpClientError(QAbstractSocket::SocketError)));
connect(&tcpClient,SIGNAL(readyRead()),this,SLOT(tcpClientReadMsg()));
}
tcpClientConnected使我们为connected信号提供的槽。当我们的tcp协议成功连接的时候会发出。
tcpClientError我们为tcp错误建立的槽。它管理一切tcp过程中发生的错误。
3.connect_to_server()函数来建立建立连接
int my_text_socket::connect_to_server()
{
static int retry = 5;
if(--retry > 0) {
tcpClient.connectToHost("192.168.4.171", 6000);
}
printf("I try to connect\n");
return 0;
}
这个函数的主力军是connectToHost
查qt的帮助文档发现他是一个重载函数
形式1:void QAbstractSocket::connectToHost(const QString & hostName, quint16 port, OpenMode openMode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol);
形式2:virtual void connectToHost(const QHostAddress & address, quint16 port, OpenMode openMode = ReadWrite);
像我那样定义居然也成功了不可思议。还是不太了解c++的原理吧。本人学c的自从接触了qt才开始学c++低子不好。
4.最后我们还需要定义一下tcpClientError(QAbstractSocket::SocketError socketError);
网上的一个问答很好的揭示了这一原理。其问题是这样的,
如何判断qt中的connectToHost函数成功连接服务器?
试图连接主机host的指定端口port并且立即返回。任何连接或者正在进行的连接被立即关闭,并且QSocket进入HostLookup 状态。当查找成功,它发射hostFound(),开始一个TCP连接并且进入Connecting状态。最后,当连接成功时,它发射connected()并且进入Connected状态。如果在任何一个地方出现错误,它发射error()。host可以是一个字符串形式的IP地址,也可以是一个DNS名称。如果需要QSocket将会进行一个普通的DNS查找。注意port是本地字节顺序,不像其它库那样。
这里就不详细研究了。等项目做完了有空可以学学把。