• 7335阅读
  • 3回复

哪位大侠知道QT如何下载网页,我的代码怎么没有反应阿 [复制链接]

上一主题 下一主题
离线gggb0606
 
只看楼主 正序阅读 楼主  发表于: 2009-04-24
— 本帖被 XChinux 执行加亮操作(2009-04-25) —
//******************q1htp.h*********************************
#ifndef Q1HTP_H
#define Q1HTP_H
#include <QString>
#include <QObject>
#include <QUrl>
     class Down:QObject
     {
    Q_OBJECT
    public:
    QString getHttp(QUrl *);
    
    int flag;
    public slots:
     void httpdone(bool);
     };


#endif


//*****************************q1htp.cpp*********************
#include <QString>
#include <QtNetwork/QHttp>
#include <QUrl>
#include <QByteArray>
#include "q1htp.h"
using namespace std;
#include <iostream>

QString Down::getHttp(QUrl *url)
{   flag=0;
   QUrl *url1=new QUrl("http://www.boc.cn/sourcedb/whpj/");
  

  QHttp *http = new QHttp(0);
  http->setHost(url1->host());

  http->get(url1->path());
  connect(http, SIGNAL(done(bool)), this, SLOT(httpdone(bool)));
  cout<<http->readAll().data()<<"^^^^^";
  if(flag==1)
  return http->readAll().data();
else return 0;
    }
    
    void Down::httpdone(bool error)
{ cout<<"safbsdjk";
      if (error == false)
    {
        flag=1;
    }

}


我跟踪了一下,没有返回任何东西,0都没有返回,这是为什么呢,水知道怎么下载阿,我急用呢。
还有我用c写了一个下载的程序,有时候好用,有时候不好用,代码有时候会缺少一些东西不知道为什么,我给大家贴出来看看
p, li { white-space: pre-wrap; }
p, li { white-space: pre-wrap; }
using namespace std;
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string>
#include <cstring>
#include <iconv.h>
#include "htp.h"


void  toLowstr(char *str)
{
for(int i=0;str!='\0';i++)
if(str>='A'&&str<='Z')
str+='a'-'A';
}

//char *str=new char[10724287];  
//static char strs[2724287];
char strs[2724287];
char *geturl(char *url)
{
    memset(strs,0,2724287);
int sockfd;
struct sockaddr_in addr;
struct hostent *pURL;
char myurl[65535];
char *pHost = 0;
char host[32767], GET[32767];
char header[32767] = "";
static char text[65535];
char *str,*str1,*str2,*str3;
str=strs;
string code = "gb2312";
int i;
str2=strs;
string sstr1;

/*
* 分离url中的主机地址和相对路径
*/
strcpy(myurl, url);
i=strlen(myurl);
if(myurl[0]=='h'&&myurl[1]=='t'&&myurl[2]=='t'&&myurl[3]=='p')
for(int i1=0;i1<=i-7;i1++)
{
myurl[i1]=myurl[i1+7];
}
for (pHost = myurl; *pHost != '/' && *pHost != '\0'; ++pHost)
{

};
if ( (int)(pHost - myurl) == strlen(myurl) )
strcpy(GET, "/");
else
strcpy(GET, pHost);
*pHost = '\0';
strcpy(host, myurl);
//printf("%s\n%s\n", host, GET);

/*
* 设定socket参数,并未真正初始化
*/
sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
pURL = gethostbyname(host);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long*)pURL->h_addr);
addr.sin_port =htons(80);

/*
* 组织发送到web服务器的信息
* 为何要发送下面的信息请参考HTTP协议的约定
*/
strcat(header, "GET ");
strcat(header, GET);
strcat(header, " HTTP/1.1\r\n");
strcat(header, "HOST: ");
strcat(header, host);
strcat(header, "\r\nConnection: Close\r\n\r\n");

/*
* 连接到服务器,发送请求header,并接受反馈(即网页源代码)
*/
connect(sockfd,(sockaddr *)&addr,sizeof(addr));

send(sockfd, header, strlen(header), 0);
size_t n=0;
unsigned int p,q,t;
iconv_t cd;
unsigned int m;
//str=new char [204800];
///memset(str,0,204800);
m=65536;
q=0;
const char *code1="";
while ( n=recv(sockfd, text, 65535, 0) > 0)
{
p=strlen(text);
t=p;
n=size_t(p);
str1=new char [n+1];
str3=str1;
strcpy(str1,text);


         if(q==0)
         {
         toLowstr(str1);
         sstr1=str1;
         int n1,n2;
           n2=sstr1.find("<html");
          n1= sstr1.find("charset",n2);
          n2=sstr1.find("\"",n1);
          if(n1!=-1)
             {
                  code= sstr1.substr(n1+8,n2-n1-8);
                code1=code.c_str();
              //  cout<<"%%%%%%%%%%%%%%"<<code<<endl;
               }
}    
q++;
cd = iconv_open("gb2312",code1);
if (iconv(cd,&str1,&n,&str,&m)==-1) {};
iconv_close(cd);

//n++;
delete (str3);

}
//cout<<"&&&&&&&&&&"<<n<<"%%%%%%%%%"<<endl;
close(sockfd);
return str2;
}


离线fifawww

只看该作者 3楼 发表于: 2009-06-01
还可以用QNetWorkAccessManager QNetworkApply QNetWorkRequest
离线XChinux

只看该作者 2楼 发表于: 2009-04-25
QTcpSocket的:


        QUrl url(...)
        QTcpSocket socket;
        socket.connectToHost(url.host(), url.port());
        if (!socket.waitForConnected())
        {
               return;
        }

       QByteArray buf;
        buf.append("GET " + url.toString() +" HTTP/1.1\r\n");
        buf.append("Accept: text/xml\r\n");
        buf.append("Host: " + url.host() + "\r\n");
        buf.append("Connection: close\r\n\r\n");
        Xmpp::outlog(QString("[HTTP SEND]") + buf.data(), Xmpp::ltInfo);
        socket.write(buf);
        if (!socket.waitForReadyRead())
        {
            socket.close();
            return;
        }
        buf.clear();
        while (!socket.atEnd())
        {
            buf.append(socket.readAll());
        }
        socket.close();
        int iPosData = buf.indexOf("\r\n\r\n") + 4;
        QHttpResponseHeader headerXML(QString(buf.left(iPosData)));
        if (headerXML.statusCode() != 200)
        {
           qDebug() << "Error to fetch profile data";
           return;
        }
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 1楼 发表于: 2009-04-25
1、用QTcpSocket,自己写HTTP头来GET或者POST网页
2、用QHttp,GET或者POST(需要设Header)网页
3、用QWebPage(webkit模块中的)来获取网页
4、用第三方下载工具比如wget(通过QProcess)来下载网页到文件中
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个