轻量级web server Tornado代码分析_goldlevi的博客-CSDN博客


本站和网页 https://blog.csdn.net/goldlevi/article/details/7047726 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

轻量级web server Tornado代码分析_goldlevi的博客-CSDN博客
轻量级web server Tornado代码分析
goldlevi
于 2011-12-06 21:18:01 发布
13541
收藏
分类专栏:
PYTHON
文章标签:
server
代码分析
web
events
socket
iostream
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/goldlevi/article/details/7047726
版权
PYTHON
专栏收录该内容
0 篇文章
0 订阅
订阅专栏
最近在做项目,使用了Tornado这个用python写的由Facebook开源出来的web服务器框架。这确实是一个轻量级的框架,只需要几行代码,直接运行脚本,就可以建立起一个server了。Tornado使用了epoll方式,在linux环境下,用了epoll的,总是受到更多的关注,呵呵。这比我们销售短信项目中使用的c++ Poco库使用的poll模型效率要高一些。再加上python语言本身强大的脚本能力,灰度发布从代码行数上来讲,非常得少。没有括号而依赖缩进的规则,使得Tornado的源代码看起来也比较舒服,而且他们均出自牛人之手,确实是学习网络编程的好对象。
Tornado采用多进程 + 非阻塞 + epoll的模型,可以提供比较强大的网络响应性能。在我们的项目中,单个实例的灰度发布server就可以支持每秒1500次的请求响应。而通过Nginx与tornado一起部署,可以同时支持多个实例的运行,从而支持加倍的请求响应,满足当前旺旺用户的升级需求。下图是旺旺灰度发布的架构图:
现在把Tornado里面的部分内容,以及一些重要的资料分享给大家,有兴趣的同学可以玩一下。
1 Tornado来历
Tornado是一个开源的网络服务器框架,该平台基于社交聚合网站FriendFeed的实时信息服务开发而来。2007年,4名谷歌前软件工程师一起创办了FriendFeed,旨在使用户能方便地跟踪好友在Facebook和Twitter等多个社交网站上的活动。结果两年后,Facebook宣布收购FriendFeed,这一交易的价格约为5000万美元。而此时,FriendFeed只有12名员工。据说这帮人后来又到了Google,搞出了现在的Google App Engine …… 
Tornado由Python编写,跟其他主流的Web服务器框架不同是采用epoll非阻塞IO,响应快速,可处理数千并发连接,特别适用用于实时的Web服务。Tornado当前版本为2.1.1,官方网站为http://www.tornadoweb.org/,有兴趣的同学可以去尝试一下。
2 Tornado简介
         Tornado主要包含了如下四部分内容。官方的帮助文档,实际上只是源码注释的集合。大家直接看源码就可以了。
Core web framework
tornado.web —RequestHandler and Application classes tornado.httpserver — Non-blocking HTTP servertornado.template — Flexible output generationtornado.escape — Escaping and string manipulationtornado.locale — Internationalization support Asynchronous networking
tornado.ioloop — Main event looptornado.iostream — Convenient wrappers for non-blocking socketstornado.httpclient — Non-blocking HTTP clienttornado.netutil — Miscellaneous network utilities Integration with other services
tornado.auth — Third-party login with OpenID and OAuthtornado.database — Simple MySQL client wrappertornado.platform.twisted — Run code written for Twisted on Tornadotornado.websocket — Bidirectional communication to the browsertornado.wsgi — Interoperability with other Python frameworks and servers Utilities
tornado.autoreload — Automatically detect code changes in developmenttornado.gen — Simplify asynchronous codetornado.httputil — Manipulate HTTP headers and URLstornado.options — Command-line parsingtornado.process — Utilities for multiple processestornado.stack_context — Exception handling across asynchronous callbackstornado.testing — Unit testing support for asynchronous code
今天主要和大家分享一下HTTP SERVER的相关内容。
2.1Tornado HTTP SERVER
使用Tornado可以很方便地架构出各种类型的web服务器。我们现在从HTTP服务器入手,来看一下它的实现。下面这张图大家应该见得很多了,是所有web server的一般工作方式。
l  服务器端bind到一个端口,然后开始listen。
l  客户端connect上来以后,将请求发送给服务端。
l  服务端处理完成后返回给客户端。
这样,一个请求就处理结束了。不过,当需要处理成千上万的连接的时候,我们就会在这个基础上考虑更多的情况。这也就是大家熟悉的The C10K problem。一般大家会有如下一些选择:
l  一个线程服务多个客户端,使用非阻塞I/O和水平触发的就绪通知
l  一个线程服务多个客户端,使用非阻塞I/O和就绪改变时通知
l  一个服务线程服务多个客户端,使用异步I/O
l  一个服务线程服务一个客户端,使用阻塞I/O
l  把服务代码编译进内核
Tornado采用的就是:多进程 + 非阻塞 + epoll模型
下面这张图基本上就显示了Tornado与网络相关的所有内容了:
2.2 第一个HTTP server例子
下面是官网提供的一个hello world的代码示范。
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
application = tornado.web.Application([
    (r"/", MainHandler),
])
if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
实现非常简单, 只需要定义自己的处理方法, 其它的东西全部交给Tornado完成。首先创建web application, 并把我们的处理方法MainHandler传递过去。然后在8888开始监听。最后启动事件循环, 开始监听网络事件,主要是socket的读和写。Python又是这样一种便捷的语言,上面这段代码直接贴到文本中,无需编译,就可以直接运行,一个server就产生了。
2.3 模块分析
我们接下来将逐个分析这部分代码。首先对Tornado有个全面的了解。Tornado服务器有3大核心模块:
(1) IOLoop
从上面的代码可能看出,Tornado为了实现高并发和高性能, 使用了一个IOLoop来处理socket的读写事件, IOLoop基于epoll, 可以高效的响应网络事件. 这是Tornado高效的保证. 
(2) IOStream
为了在处理请求的时候, 实现对socket的异步读写, Tornado实现了IOStream类, 用来处理socket的异步读写。
(3) HTTPConnection
这个类用来处理http的请求,包括读取http请求头,读取post过来的数据,调用用户自定义的处理方法,以及把响应数据写给客户端socket。
下面这幅图描述了tornado服务器的大体处理流程, 接下来我们将会详细分析每一步流程的实现。
3 源码分析
3.1 bind和listen
服务器的第一步就是bind。Httpserver.py的bind函数可以看到一个标准的服务器启动过程:
def bind(self, port, address=None, family=socket.AF_UNSPEC):
        if address == "":
            address = None
                   // 查找网卡信息
        for res in socket.getaddrinfo(address, port, family, socket.SOCK_STREAM,
                                      0, socket.AI_PASSIVE | socket.AI_ADDRCONFIG):
            af, socktype, proto, canonname, sockaddr = res
            sock = socket.socket(af, socktype, proto)
            flags = fcntl.fcntl(sock.fileno(), fcntl.F_GETFD)
            flags |= fcntl.FD_CLOEXEC
            fcntl.fcntl(sock.fileno(), fcntl.F_SETFD, flags)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            if af == socket.AF_INET6:
                if hasattr(socket, "IPPROTO_IPV6"):
                    sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
            sock.setblocking(0)
                            // bind和listen
            sock.bind(sockaddr)
            sock.listen(128)
            self._sockets[sock.fileno()] = sock
                   // 加入io_loop
            if self._started:
                self.io_loop.add_handler(sock.fileno(), self._handle_events,
                                         ioloop.IOLoop.READ)
   
for循环保证对每张网卡上的请求都得到监听。对于每个网卡,先建立socket,然后bind listen,最后将socket加入到io_loop,注册的事件是ioloop.IOLoop.READ,也就是读事件。程序中还添加了对ipv6的处理。回调函数为_handle_events, 一旦listen socket可读, 说明客户端请求到来, 然后调用_handle_events接受客户端的请求。接下来,看一下_handle_events是怎么处理的。
3.2 accept
接上一节,Httpserver.py的_handle_events函数实现了accept的过程。代码如下:
    def _handle_events(self, fd, events):
        while True:
            try:
                connection, address = self._sockets[fd].accept()
            except socket.error, e:
                if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN):
                    return
                raise
            if self.ssl_options is not None:
                                   //这里有一段处理ssl的代码,比较长,省略
            try:
                stream = iostream.IOStream(connection, io_loop=self.io_loop)
                HTTPConnection(stream, address, self.request_callback,
                               self.no_keep_alive, self.xheaders)
            except:
                logging.error("Error in connection callback", exc_info=True)
accept方法返回客户端的socket, 以及客户端的地址。然后创建IOStream对象, 用来处理socket的异步读写. 这一步会调用ioloop.add_handler把client socket加入ioloop,再然后创建HTTPConnection, 处理用户的请求。接下来,我们看下iostream和httpconnection。
3.3 iostream
为了实现对client socket的异步读写, 需要为client socket创建两个缓冲区: _read_buffer和_write_buffer,这样我们就不用直接读写socket,进而实现异步读写。这些操作都封装在IOStream类中。概括来说,IOStream对socket的读写做了一层封装,通过使用两个缓冲区,实现对socket的异步读写。
IOStream与socket是一一对应的, 在iosteram.py可以找到iosteram的init方法:
    def __init__(self, socket, io_loop=None, max_buffer_size=104857600,
                 read_chunk_size=4096):
        self.socket = socket
        self.socket.setblocking(False)
        self.io_loop = io_loop or ioloop.IOLoop.instance()
        self._read_buffer = collections.deque()
        self._write_buffer = collections.deque()
        self._state = self.io_loop.ERROR
        with stack_context.NullContext():
            self.io_loop.add_handler(
                self.socket.fileno(), self._handle_events, self._state)
可以看到,初始化的时候建立了两个buffer,然后把自己的socket放到了io_loop。这样,当这个socket有读写的时候,就会回调到注册的事件self._handle_events里面了。_handle_events就很容易理解了,代码如下:
    def _handle_events(self, fd, events):
        if not self.socket:
            logging.warning("Got events for closed stream %d", fd)
            return
        try:
            if events & self.io_loop.READ:
                self._handle_read()
            if events & self.io_loop.WRITE:
                self._handle_write()
            if events & self.io_loop.ERROR:
                self.io_loop.add_callback(self.close)
                return
            state = self.io_loop.ERROR
            if self.reading():
                state |= self.io_loop.READ
            if self.writing():
                state |= self.io_loop.WRITE
            if state != self._state:
                self._state = state
                self.io_loop.update_handler(self.socket.fileno(), self._state)
        except:
            logging.error("Uncaught exception, closing connection.",
                          exc_info=True)
            self.close()
            raise
3.4 ioloop
在Tornado服务器中,IOLoop是调度的核心模块,Tornado服务器回把所有的socket描述符都注册到IOLoop, 注册的时候指明回调处理函数,IOLoop内部不断的监听IO事件, 一旦发现某个socket可读写, 就调用其注册时指定的回调函数。 IOLoop使用了单例模式。
在Tornado运行的整个过程中,只有一个IOLoop实例,仅需一个 IOLoop实例, 就可以处理全部的IO事件。上文中多次用到了ioloop.IOLoop.instance()这个方法。它会返回ioloop的一个单例。
下面这段代码,可以看到python是怎么定义一个单例的。代码中使用了cls,这不是一个关键字,和self一样,cls是python的一个built-in变量,self表示类的实例,而cls表示类。所以大家看了几个函数会发现,python的成员函数的第一个参数,不是self就是cls。
class IOLoop(object):
    def instance(cls):
        if not hasattr(cls, "_instance"):
            cls._instance = cls()
        return cls._instance
    def initialized(cls):
        return hasattr(cls, "_instance")
def start(self):
        if self._stopped:
            self._stopped = False
            return
        self._running = True
        while True:
            poll_timeout = 0.2
            callbacks = self._callbacks
            self._callbacks = []
            for callback in callbacks:
                self._run_callback(callback)
            try:
                event_pairs = self._impl.poll(poll_timeout)
            except Exception, e:
                if (getattr(e, 'errno', None) == errno.EINTR or
                    (isinstance(getattr(e, 'args', None), tuple) and
                     len(e.args) == 2 and e.args[0] == errno.EINTR)):
                    continue
                else:
                    raise
            if self._blocking_signal_threshold is not None:
                signal.setitimer(signal.ITIMER_REAL,
                                 self._blocking_signal_threshold, 0)
            self._events.update(event_pairs)
            while self._events:
                fd, events = self._events.popitem()
                self._handlers[fd](fd, events)
        self._stopped = False
        if self._blocking_signal_threshold is not None:
            signal.setitimer(signal.ITIMER_REAL, 0, 0)
这里的poll根据不同的系统环境,支持select、epoll和KQueue三种模式。下面是epoll模式的处理:
class _EPoll(object):
    _EPOLL_CTL_ADD = 1
    _EPOLL_CTL_DEL = 2
    _EPOLL_CTL_MOD = 3
    def __init__(self):
        self._epoll_fd = epoll.epoll_create()
    def fileno(self):
        return self._epoll_fd
    def register(self, fd, events):
       epoll.epoll_ctl(self._epoll_fd, self._EPOLL_CTL_ADD, fd, events)
    def modify(self, fd, events):
        epoll.epoll_ctl(self._epoll_fd, self._EPOLL_CTL_MOD, fd, events)
    def unregister(self, fd):
        epoll.epoll_ctl(self._epoll_fd, self._EPOLL_CTL_DEL, fd, 0)
    def poll(self, timeout):
        return epoll.epoll_wait(self._epoll_fd, int(timeout * 1000))
4 性能比较
这是一段官网上的描述:
“一个 Web 应用的性能表现,主要看它的整体架构,而不仅仅是前端的表现。和其它的 Python Web 框架相比,Tornado 的速度要快很多。我们在一些流行的 Python Web 框架上(Django、web.py、CherryPy),针对最简单的 Hello, world 例子作了一个测试。对于 Django 和 web.py,我们使用 Apache/mod_wsgi 的方式来带,CherryPy 就让它自己裸跑。这也是在生产环境中各框架常用的部署方案。对于我们的 Tornado,使用的部署方案为前端使用nginx 做反向代理,带动 4 个线程模式的 Tornado,这种方案也是我们推荐的在生产环境下的 Tornado 部署方案(根据具体的硬件情况,我们推荐一个 CPU 核对应一个 Tornado 伺服实例,我们的负载测试使用的是四核处理器)。我们使用 Apache Benchmark (ab),在另外一台机器上使用了如下指令进行负载测试:
ab -n 100000 -c 25 http://10.0.1.x/
在 AMD Opteron 2.4GHz 的四核机器上,结果如下图所示:
在我们的测试当中,相较于第二快的服务器,Tornado 在数据上的表现也是它的 4 倍之多。即使只用了一个 CPU 核的裸跑模式,Tornado 也有 33% 的优势。”
使用同样的参数,对旺旺灰度发布服务器测试结果如下:
ab -n 20000 -c 50 'http://10.20.147.160:8080/redirect?uid=cnalichntest&ver=6.05.10&ctx=alitalk&site=cnalichn'
配置nginx + 1个tornado服务器的时候:Requests per second:    672.55 [#/sec] (mean)
配置nginx + 4个tornado服务器的时候:Requests per second:    2187.45 [#/sec] (mean)
goldlevi
关注
关注
点赞
收藏
打赏
评论
轻量级web server Tornado代码分析
最近在做项目,使用了Tornado这个用python写的由Facebook开源出来的web服务器框架。这确实是一个轻量级的框架,只需要几行代码,直接运行脚本,就可以建立起一个server了。Tornado使用了epoll方式,在linux环境下,用了epoll的,总是受到更多的关注,呵呵。这比我们销售短信项目中使用的c++ Poco库使用的poll模型效率要高一些。再加上python语言本身强大的
复制链接
扫一扫
专栏目录
Tornado Server-开源
05-10
Tornado Server专为快速构建复杂的业务Web应用程序而设计。 模块化设计具有出色的可扩展性,并且可以与现有基础架构很好地集成。 Tornado Server可以使用标准的Web浏览器进行远程维护。
7 个提高效率的 Jupyter 神级插件
公众号:Python研究者
09-17
351
今天再跟大家介绍七个不常见但是却很好用且能够提高效率的Jupyter扩展插件。一起来看看呀~1、voila这个扩展将将Jupyter笔记本变成独立的网络应用程序。与通常的html转换的笔记本不同,每个连接到Voilà 应用程序的用户都会启动一个Jupyter内核,所以通过这个web应用我们可以对Jupyter代码进行修改和回调,他的web是通过tornado来开发的,这个扩展在GitHub上有超过...
评论 1
您还未登录,请先
登录
后发表或查看评论
Tornado web server 初体验
YorkCai的专栏
07-14
7620
1. Tornado 是什么?
Tornado 是 FriendFeed 使用的可扩展的非阻塞式
web 服务器及其相关工具的开源版本。
详见中文官网:http://www.tornadoweb.cn/
2. 在ubuntu下安装Tornado并测试官网给出的HelloWorld程序
2.1 自动安装
命令: pip intstall tornado
由于我刚开始使用Pyt
tornado搭建server 实现 celery 定时任务
weixin_39616762的博客
03-02
2627
tornado 是一个异步服务器框架,性能不错的,这里搭建一个简单的 server,来调用celery 创建 定时任务异步任务的实现原理也相对简单,因为中间 broker 的存在,其实也就是将客户端和服务器分开了。那么定时任务又是怎么个道理呢?其实定时任务是一种特别的异步任务,原理和异步任务一样,但是,有一样不相同的就是定时任务的客户端是定时器,我们设置定时任务的执行周期,然后就交给 Celery...
大学生web前端期末大作业实例代码 (1500套,建议收藏) HTML+CSS+JS
最新发布
HTML网页设计 专注大学生网页设计
10-16
7587
临近期末,大一新生的各种考试和专业结课作业纷至沓来。web实训大作业、网页期末作业、web课程与设计、网页设计等,简直让人头大。你还在为网页设计老师的作业要求感到头大?网页作业无从下手?网页要求的总数量太多?没有合适的模板?等等一系列问题。你想要解决的问题,在这篇博文中基本都能满足你的需求, 废话不多说,直接看效果。📔网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。📓网站程序方面:计划采用最新的网页编程语言HTML5+CSS3+JS程序语言完成网站的功能设计。并确
隐藏tornado响应头中的版本号——“Server“: “TornadoServer6.0.2“
jlb1024的博客
01-20
253
隐藏tornado响应头中的Server现象位置解决办法效果结束
现象
在tornado响应头中Server暴露服务器框架和版本号位置如下图:
位置
经查看源码发现是在虚拟环境第三方包路径/torando/web.py文件中RequestHandlerlei类(或者导from tornado.web import RequestHandler包进RequestHandler类)在clear方法中如下图:
解决办法
直接删除"Server": "TornadoServer/%s" % tornado.ve
tornado----编写简易的服务器
u010585242的博客
08-18
332
在自动化测试过程中,用来模拟一个XXX服务器,然后根据接口规范,返回需要的结果。在使用tornado实现的过程中总结如下:
1、使用tornado实现http服务器的大致框架如下:import tornado.web
import tornado.inloopclass XXServer(tornado.web.RequestHandler):
def get(self):
Tornado简介
小宝儿的学习之路
04-12
1364
Tornado龙卷风是一个开源的网络服务器框架,它是基于社交聚合网站FriendFeed的实时信息服务开发而来的
Tornado是使用Python编写的Web服务器兼Web应用框架
与主流Web服务器框架不同的是,Tornado是异步非阻塞式服务器,得益于非阻塞式和对epoll模型的运用
Tornado是实时Web服务的一个理想框架,它非常适合开发长轮询、WebSocket和需要与每个用户建立...
采用Tornado作为Web Server 运行第三方Web框架
BOKE
05-11
965
部门内部的所有Web应用,restful服务等都是采用Python开发的,主要用到了bottle框架和django框架。
这两个框架都是采用的自身的Web Server运行的,在高负载的情况下响应比较慢。改为Tornado作为Web Server来承载应用。
1. Bottle应用
python tornado 搭建webServer
阳光柠檬_的技术笔记
07-14
6864
1.安装tornado,我用的windows环境
在tornado网站上下载tornado:
https://pypi.python.org/packages/source/t/tornado/tornado-4.2.tar.gz
解压tornado-4.2.tar.gz
在解压后的tornado-4.2文件夹中执行命令:
python setup.py install
完成安装。2.
Tornado运行和部署
王菜菜的成长之路
03-31
715
运行和部署
由于Tornado自身提供了HTTPServer, 所以它的运行和部署与其他Python Web 框架不一样。我们可以直接写一个main()方法来启动一个服务器,而不是配置WSGI容器。
def main():
app = make_app()
app.listen(8888)
IOLoop.current().start()
if __name__ =...
python Tornado简单服务器搭建
ly52352148的博客
09-01
6571
官方网站http://old.sebug.net/paper/books/tornado/
FriendFeed使用了一款使用 Python 编写的,相对简单的 非阻塞式 Web 服务器。其应用程序使用的 Web 框架看起来有些像 web.py 或者
Google 的 webapp, 不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。
To
tornado异步请求响应速度的实例测试
u011734144的专栏
12-06
1901
为什么要用异步处理?
大部分Web应用(包括我们之前的例子)都是阻塞性质的,也就是说当一个请求被处理时,这个进程就会被挂起直至请求完成。在大多数情况下,Tornado处理的Web请求完成得足够快使得这个问题并不需要被关注。然而,对于那些需要一些时间来完成的操作(像大数据库的请求或外部API),这意味着应用程序被有效的锁定直至处理结束,很明显这在可扩展性上出现了问题。
不过,Tornado给了我...
windows搭建tornado开发环境
劲枫的博客
04-28
1208
操作系统:windows安装python2.7https://www.python.org/2.使用pip安装virtualenv虚拟化环境(建议用virtualenvwrapper 参见安装方式)#pip install virtualenv#pip install -i http://pypi.douban.com/simple/ --trusted-hostpypi.douban.com v...
一个网站的诞生07-- Tornado Web Server
大数据和机器学习研究
08-15
1555
用Spider抓取数据,然后再做各种处理,然后放到web页面供大家使用。
那么,就需要一个Web Server。
几乎每种语言都有一大堆Web Server开发框架,Python也不例外,比如这里http://www.zhihu.com/question/20706333。廖雪峰同学还有个python的教程http://www.liaoxuefeng.com/wiki/00137473
基于Linux的C++轻量级web服务器/webserver/httpserver
garbage_man的博客
03-09
6235
WebServer详解
使用C++语言,编写了一个基于Linux的HttpServer,能够实现上万的QPS。
项目地址:
gitee仓库
github仓库
功能
利用I/O多路复用技术的Epoll与线程池实现【单Reactor、多线程】的高并发服务器模型;
利用有限状态机和正则解析HTTP请求报文;
利用STL标准库容器封装char,实现自定义的缓冲区;
基于堆结构实现的定时器,关闭超时的非活跃网络连接;
支持GET请求
项目详解
WebServer项目——webserver详解
WebServe
基于Linux的C++轻量级web服务器/webserver/httpserver——webserver类详解
garbage_man的博客
04-21
1881
webserver介绍
这个webserver类是对整个web服务器的抽象。在这个类中,调用之前编写的四大模块:Httpconnection类、Epoller类、Timer类以及ThreadPool类完成整个服务器项目的功能。
webserver的逻辑
第一步是服务器的初始化。在webserver的构造函数中完成对Httpconnection类、Epoller类、Timer类以及ThreadPool类对象的初始化,同时还需要设置好服务器的socket,暴露端口等相关信息
m_port = port;
Tornado源码剖析
runner668的博客
10-03
1517
转自:https://www.tuicool.com/articles/jmuYRfB
Tornado简介
Tornado是Python语言写的Web服务器兼Web框架。Tornado速度快,每秒可处理数以千计的连接,得益于其非阻塞I/O及多路复用的应用。
Tornado核心工作流程
图1.Tornado核心流程
图2.Tornado核心模块UML
Tornado优势
绝大多...
gsoap服务端
jiangxu20072122的专栏
09-24
775
gsoap开源代码
请求处理过程:
soap_serve 处理远程客户端请求并返回应答;
soap_accept 接受远程客户端连接请求并设置socket属性;
soap_begin_serve 接受远程客户端请求报文头、报文体;
soap_recv_raw 接受远程客户端请求报文;
soap_serve_request 对客户端请求报文进行业务处理并返回应答报文,关闭socket
Python Web框架Tornado运行和部署
weixin_33849215的博客
04-14
347
为什么80%的码农都做不了架构师?>>>
...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
goldlevi
CSDN认证博客专家
CSDN认证企业博客
码龄17年
暂无认证
23
原创
25万+
周排名
191万+
总排名
11万+
访问
等级
1281
积分
24
粉丝
11
获赞
11
评论
25
收藏
私信
关注
热门文章
Leader/Follower多线程网络模型介绍
19397
轻量级web server Tornado代码分析
13541
linux Proc文件系统介绍及运用总结
11157
CoInitializeEx 与CoInitialize的区别
10674
drag与drop事件
9828
分类专栏
C++与Windows编程
5篇
javascript
4篇
xpcom
Android开发
10篇
PYTHON
Linux
4篇
网络相关
3篇
flash
最新评论
Leader/Follower多线程网络模型介绍
jkand1
回复
期待一片自己的蓝天:
https://github.com/spsoft/spserver
Leader/Follower多线程网络模型介绍
期待一片自己的蓝天:
附件去哪儿下载呀?
drag与drop事件
思中译:
楼主文章第一行“为了支持网页上一些元素的拖动效果,可以使用drag和drog事件。”
是drop不是drog
Leader/Follower多线程网络模型介绍
tang0827:
谢谢!
轻量级web server Tornado代码分析
爱知菜:
谢谢分享
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
JS调用Flash和Flash调用JS
HSHA多线程网络编程模型介绍
Leader/Follower多线程网络模型介绍
2012年6篇
2011年14篇
2010年9篇
目录
目录
分类专栏
C++与Windows编程
5篇
javascript
4篇
xpcom
Android开发
10篇
PYTHON
Linux
4篇
网络相关
3篇
flash
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
goldlevi
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值