Qt学习之路——QHttp,QTcpSocket与QAbstractSocket

September 9th, 2013 by JasonLe's Tech Leave a reply »

好久没有学习Qt了,因为研究生开学,各种杂事,使得qt学习之路中断了一段时间,最近良心发现,要重拾qt,qt封装好了socket库,这使得我们我们调用socket库来创建网络应用相当快捷。比如用qt来下载一个文件,访问webserver都可以方便的使用。
如果要是想创建自己的SLOT函数,只需包含QAbstractSocket,然后查看document,重写4个规定的SLOT函数,就ok了。

众所周知qt网络编程一般都要有4个SLOT函数:1.连接主机2.断开连接3.准备读4.读出这样就可以分解每一步,做出自己想做的功能。
可以添加#inculde #include<QAbstractSocket>

然后重写slot函数 bytesWritten(qint64 bytes)然后将socket->readAll()就好。

void sockettest::Test()
{
    socket = new QTcpSocket(this);
    connect(socket,SIGNAL(connected()),this,SLOT(connected()));
    connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()));
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()));
    connect(socket,SIGNAL(bytesWritten ( qint64 bytes )),this,SLOT(bytesWritten ( qint64 bytes )));

    qDebug()<< "Connecting......";
    socket->connectToHost("weibo.com",80);

    if(!socket->waitForConnected(1000))
    {
        qDebug()<<"ERROR     "<<  socket->errorString();
    }
}
void	sockettest::connected ()
{
    qDebug()<<"connected";
    socket->write("HEAD / HTTP/1.0\r\n\r\n\r\n");
}
void	sockettest::disconnected ()
{
    qDebug()<<"disconnected";
}
void	sockettest::bytesWritten ( qint64 bytes )
{
    qDebug()<<"we wrote: "<<bytes;
}
void	sockettest::readyRead ()
{
    qDebug()<<"reading.....";
    qDebug()<<  socket->readAll();
}

其中的 socket->connectToHost(“weibo.com”,80);就是连接网址,然后connected(),当连接完成以后,使用readyRead()打印server回复的消息。
2013-09-09 22:31:52的屏幕截图
对于QHttp 所以我们可以使用他来访问网页,然后重写三个SLOT函数

    void	stateChanged ( int state );
    void	responseHeaderReceived ( const QHttpResponseHeader & resp );
    void	requestFinished ( int id, bool error );

这三个函数可以触发各种自定义操作,比如将读到的文本写入本地文件,详细做法可以在void requestFinished ( int id, bool error );中实现
比如创建一个QFile 写入本地,
在QHttp中可以使用 http->setHost(“xxxy.lzu.edu.cn”); http->get(“/index.html”);
来访问网页获取需要的网页信息,时候调用 http->readAll()来读取~
下面的工作就是来熟悉API即可,Qt提供了丰富的SIGANL函数与SLOT接口!!!

切记!!!