• 11405阅读
  • 23回复

写一个http服务端来解析http请求,用什么类呀? [复制链接]

上一主题 下一主题
离线foxgod
 

只看楼主 倒序阅读 楼主  发表于: 2013-12-30
我想写发送个http请求,带参数的,然后再http server端解析这个请求,按照不同的参数,来返回值,可是不知道用什么类写这个http server。
我在client 端用QNetworkAccessManager发送一个http请求(带参数),然后再http server解析这个http,应该怎么做呢,用什么类呢,我用QTCPSERVER ;来监听我的80端口,可是没效果。
离线退避九舍

只看该作者 1楼 发表于: 2014-01-01
http和tcp不是一层的
离线foxgod

只看该作者 2楼 发表于: 2014-01-02
回 1楼(退避九舍) 的帖子
我看过一个帖子,写的是httpserver端,就是用tcp解析的,因为http请求的时候,要建立一个TCP链接,但是client还是以前get的方式发送请求吗
离线dbzhang800

只看该作者 3楼 发表于: 2014-01-02
Re:回 1楼(退避九舍) 的帖子
引用第2楼foxgod于2014-01-02 09:21发表的 回 1楼(退避九舍) 的帖子 :
我看过一个帖子,写的是httpserver端,就是用tcp解析的,因为http请求的时候,要建立一个TCP链接,但是client还是以前get的方式发送请求吗

HTTP 比 TCP 高一层,至于你是get/post还是put,在TCP层看来没什么区别,都是收到一堆数据。只不是这堆数据的内容有所不同罢了
离线foxgod

只看该作者 4楼 发表于: 2014-01-08
解决了,客户端是http get,服务器端用TCP监听,是可以的
离线foxgod

只看该作者 5楼 发表于: 2014-01-09
回 3楼(dbzhang800) 的帖子
现在客户端是http发送请求,在服务器端用tcp监听实现了,但是有个问题,就是我在服务器端得到这个请求后,给客户端发送数据,为什么数据较少的时候,客户端得不到呢?例如
  1. QTcpSocket* socket = serverConnect;
  2. os.setAutoDetectUnicode(true);
  3.             os << "HTTP/1.0 200 Ok\r\n"
  4.                   "Content-Type: text/html; charset=\"utf-8\"\r\n"
  5.                  "\r\n"
  6.                  "<h1>Nothing to see here</h1>\n"<<"i love you";




当数据流写的内容多的时候,客户端可以接受到,但是如果这样写,就接受不到了,为什么,例如      
            os << "i love you";
[font='Open Sans', sans-serif]在客户端用QNetworkAccessManager发送请求,用 QNetworkReply接收请求
  1. [color=#800080]QObject[/color]::connect([color=#800000]urlReplay[/color],[color=#808000]SIGNAL[/color](readyRead()),[color=#808000]this[/color],[color=#808000]SLOT[/color](download()));


还有在服务器端如何保持长连接呢??
离线dbzhang800

只看该作者 6楼 发表于: 2014-01-09
1.  flush
2. 只要你的客户端和服务器不主动断开,那就是 长连接
离线foxgod

只看该作者 7楼 发表于: 2014-01-09
回 6楼(dbzhang800) 的帖子
关键是我要把这个消息发送给客户端需要
把socket。close(),才能发回去,不close,客户端收不到,我参考的是这个代码

http://doc.qt.digia.com/solutions/4/qtservice/qtservice-example-server.html
请教
离线foxgod

只看该作者 8楼 发表于: 2014-01-09
回 6楼(dbzhang800) 的帖子
这样写,也发布出去消息
serverConnect->write("i love you");
serverConnect-》flush();
还是发不出来。
离线ashe0817

只看该作者 9楼 发表于: 2014-01-10
服务器回复请求的时候要加上Content-Length头,描述你回复的内容长度
数据和http头要保持2个空行,如"\r\n\r\n"

flush后数据就发出去了。

还不明白可以看看这个例子,虽然我觉得写的稍微有点啰嗦
http://download.csdn.net/detail/lh844386434/5015052
离线dbzhang800

只看该作者 10楼 发表于: 2014-01-10
如楼上所说, 客户端是你自己写的么? 客户端是没收到数据,还是收到了数据,但是不符合协议要求而被丢弃?
离线foxgod

只看该作者 11楼 发表于: 2014-01-14
回 9楼(ashe0817) 的帖子
嗯,我当时看QT官网上的例子的时候,也是这么觉得的。发送数据给客户端的时候,需要加上http请求头?你说的方法我试验下,顺便问下,这样的方法可以保持长连接吗,还有如何获取客户端的外网IP。
离线foxgod

只看该作者 12楼 发表于: 2014-01-14
回 9楼(ashe0817) 的帖子
还是不行呀,
  1. QTcpSocket* socket = serverConnect;
  2.             QTextStream os(socket);
  3.             os.setAutoDetectUnicode(true);
  4.             os << "HTTP/1.0 200 Ok\r\n"
  5.                    "Content-Type: text/html; charset=\"utf-8\"\r\n"
  6.                    "\r\n"<<"i love you";
  7.             socket->flush();
  8. 这样还是客户端收不到
  9. 但是把socket->flush();改成socket->close(),就可以收到了,一定要close吗???


离线ashe0817

只看该作者 13楼 发表于: 2014-01-14
。。。你的所有问题都可以在9楼给你的例子中找到。
9楼也说了,要加上Content-Length头,至于长连接或短连接是要看http头的约定,有2个字段影响连接是长是短,connection头和Keep-Alive,具体细节自己百度一下就知道了
离线foxgod

只看该作者 14楼 发表于: 2014-01-14
回 13楼(ashe0817) 的帖子
实验多次,socket不关闭,httpserver端无法发送数据给客户端,不管头是什么格式,不知道你们是不是也是一定要关闭socket
离线dbzhang800

只看该作者 15楼 发表于: 2014-01-14
Re:回 13楼(ashe0817) 的帖子
引用第14楼foxgod于2014-01-14 16:46发表的 回 13楼(ashe0817) 的帖子 :
实验多次,socket不关闭,httpserver端无法发送数据给客户端,不管头是什么格式,不知道你们是不是也是一定要关闭socket

首先要肯定一点:不需要关闭socket才能发送数据。

问题在于:你的客户端是什么,是你自己写的TCP客户端,还是别人写的TCP客户端(比如某个浏览器)。如果是别人写的TCP客户端,你需要给出证据来表明:是客户端没收到数据? 还是收到了数据,但是它认为不符合格式?

比如:我们可以设想一个情况,你的客户端是一个标准的web浏览器,但是你发送的数据不符合http协议(比如,没有指定Content-Length这个header),浏览器可能会苦苦等待你发送其他数据,在这期间,它不会有任何响应,除非你close掉TCP channel。

离线foxgod

只看该作者 16楼 发表于: 2014-01-14
回 15楼(dbzhang800) 的帖子
客户端使用http请求像web服务器发送请求,服务器接受到这个请求,执行负载均衡,发送到我配置的服务器上,在这个服务器上把消息在传送给客户端,至于你说的不关闭socket,我以前也是这么做的,但是QT官网给的例子也是关闭socket才发送数据给客户端的,你可以看下,所以我想问的是可以不关闭socket发送数据吗

下面是官网的例子
http://doc.qt.digia.com/solutions/4/qtservice/qtservice-example-server.html
离线XChinux

只看该作者 17楼 发表于: 2014-01-14
HTTP Server,这个你直接用现成的Java/C#/PHP之类的做比较方便吧,用C++/Qt做的理由是?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线dbzhang800

只看该作者 18楼 发表于: 2014-01-14
Re:回 15楼(dbzhang800) 的帖子
引用第16楼foxgod于2014-01-14 18:00发表的 回 15楼(dbzhang800) 的帖子 :
客户端使用http请求像web服务器发送请求,服务器接受到这个请求,执行负载均衡,发送到我配置的服务器上,在这个服务器上把消息在传送给客户端,至于你说的不关闭socket,我以前也是这么做的,但是QT官网给的例子也是关闭socket才发送数据给客户端的,你可以看下,所以我想问的是可以不关闭socket发送数据吗

下面是官网的例子
http://doc.qt.digia.com/solutions/4/qtservice/qtservice-example-server.html

不好意思,我前面的回复中错了一个字,应该是 “首先要肯定一点:不需要关闭socket也能发送数据。”

你提到的qtsolutions中的这个例子不能说明任何问题,它过于简单,而且由于没有Content-Length的信息,它只能通过地关闭连接来告诉浏览器数据传输完成。不然浏览器页面上可能任何东西都不显示。

而且从你的描述中,基本可以确定,不是数据没发送出去,也不是浏览器没收到,而是你的内容不符合Http协议。

如果你真要自己写server,熟悉http协议是必不可少了。
离线foxgod

只看该作者 19楼 发表于: 2014-01-15
回 18楼(dbzhang800) 的帖子
版主给我个最简单的httpserver端发送数据给客户端的例子吧,我看看需要怎么写?
离线dbzhang800

只看该作者 20楼 发表于: 2014-01-15
Re:回 18楼(dbzhang800) 的帖子
引用第19楼foxgod于2014-01-15 16:09发表的 回 18楼(dbzhang800) 的帖子 :
版主给我个最简单的httpserver端发送数据给客户端的例子吧,我看看需要怎么写?


https://github.com/nikhilm/qhttpserver

离线foxgod

只看该作者 21楼 发表于: 2014-01-15
我的这个请求是通过web服务器发送http请求,看了下说明,web服务器是短链接,也就是必须要关闭socket,客户端才能收到消息。
离线dbzhang800

只看该作者 22楼 发表于: 2014-01-15
你还是先熟悉一下Http协议吧,不清楚你为何一直认定 “必须要关闭socket,客户端才能收到消息”
离线foxgod

只看该作者 23楼 发表于: 2014-01-16
回 22楼(dbzhang800) 的帖子
我的nginx这个web服务器需要和后端服务器关闭socket才能发送消息,因为他们是端连接,客户端和web服务器链接是长连接,web服务器和后端服务器是短链接
快速回复
限100 字节
 
上一个 下一个