[Решен]HTTP сървър и двоични файлове
-
Правя HTTP сървър за едно Linux Box устройство. Като цяло всичко е готово, но срещам проблеми с прегледа на двоични файлове. HTML, CSS, javaScrip и други видове текстови файлове излизат в браузъра без проблеми, но когато изображения, или се клиента се опитва да ги свали, или цикли непрекъснато. Имам механизъм за различаване на mime типа на файловете и се чудя дали когато е image/xxx да не ползвам QImage, вместо QFile, но тогава се появява проблема "А какво да правя с Flash и видеа?".
Докато съм на въпроса? Може ли някой да ми предложи и вариант при който да пазя нещо като сесия на всеки клиент?
-
Здравей,
Само да видя дали съм те разбрал правилно. Имаш сървър и той предоставя файлове на клиент? Този клиент с какво се свързва към теб? Твоя си програма или браузър?
Ако е браузър трябва да му пращаш mime типовете, които той очаква и след това картинката/флаша като поредица от байтове.
-
Написах WEB сървър (като Apache). Клиента го достъпва през браузър. Идеята е, че устройството ще се достъпва през LAN по някаква конвенция(например фиксиран IP адрес), което също трябва да измисля (Не знам нищо за мрежата и клиентите не трябва да пипат router-и). Та като цяло всичко в този сървър си работи. На клиента пращам нещо от рода:
@HTTP/1.0 200 Ok
Content-Type: image/pngСъдържание на файла
@Всичко това го превръщам в QByteArray и го пращам. Съдържанието го взимам с "QFile::ReadAll()":http://doc.qt.nokia.com/latest/qiodevice.html#readAll, като предполагам, че тук е една от грешките ми.
@Response response;
response.setHeader("Content-Type", mimeType);QFile file(fileLocation);
file.open(QIODevice::ReadOnly);
this->write(response.write(file.readAll()));
file.close();@Response класа като цяло ми държи заглавната част. А последното което направих с this->write e:
@QTextStream stream(this->socket);
stream.setAutoDetectUnicode(true);
stream << message;
this->socket->close();@Понеже го видях на "това място":http://doc.qt.nokia.com/solutions/4/qtservice/qtservice-example-server.html, като смятам, че тук също греша, понеже файловете вече след сваляне на файла получавам съобщение, че е "счупен".
Надявам се този път да съм обяснил добре проблема си. :)
-
Доколкото разбирам, ти създаваш един QTextStream, който сочи към сокета и в него пишеш прочетените от файла данни? Мисля, че това обърква нещата. Пробвай прочетените данни от QFile да си пишеш директно в сокета. И двата класа наследяват QIODevice, така че няма да има проблеми.
-
Беше напълно прав.
По някаква неясна за мен причина преобразувах резултата от file.readAll() в QTextStream. След като го оправих всичко проработи както трябва.
Сега трябва да разбера само как да спра зареждането на страницата след като съм изпратил всичко, без да затварям сокета, така че да обработвам log-нати потребители, но ще се справя с това.
Много благодаря. -
Ако използваш QNetworkAccessManager виж "тази":http://doc.trolltech.com/4.8-snapshot/qnetworkaccessmanager.html#cookieJar функция и класа, който връща. Явно има възможност да използваш кукита с класа "QNetworkCookie":http://doc.trolltech.com/4.8-snapshot/qnetworkcookie.html
-
Идеално. А аз мислех сам да си имплементирам някаква странна работа с бисквитки. За пореден път ми беше полезен. :)