419 lines
35 KiB
HTML
419 lines
35 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
|
|
<head>
|
|
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
|
|
|
|
<title>asynchat --- 异步套接字指令/响应处理程序 — Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
|
|
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
|
|
|
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
|
|
<script src="../_static/jquery.js"></script>
|
|
<script src="../_static/underscore.js"></script>
|
|
<script src="../_static/doctools.js"></script>
|
|
<script src="../_static/language_data.js"></script>
|
|
<script src="../_static/translations.js"></script>
|
|
|
|
<script src="../_static/sidebar.js"></script>
|
|
|
|
<link rel="search" type="application/opensearchdescription+xml"
|
|
title="在 Python 3.8.20 文档 中搜索"
|
|
href="../_static/opensearch.xml"/>
|
|
<link rel="author" title="关于这些文档" href="../about.html" />
|
|
<link rel="index" title="索引" href="../genindex.html" />
|
|
<link rel="search" title="搜索" href="../search.html" />
|
|
<link rel="copyright" title="版权所有" href="../copyright.html" />
|
|
<link rel="next" title="signal --- 设置异步事件处理程序" href="signal.html" />
|
|
<link rel="prev" title="asyncore --- 异步套接字处理器" href="asyncore.html" />
|
|
<link rel="canonical" href="https://docs.python.org/3/library/asynchat.html" />
|
|
|
|
|
|
|
|
|
|
|
|
<style>
|
|
@media only screen {
|
|
table.full-width-table {
|
|
width: 100%;
|
|
}
|
|
}
|
|
</style>
|
|
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
|
|
<script type="text/javascript" src="../_static/copybutton.js"></script>
|
|
<script type="text/javascript" src="../_static/menu.js"></script>
|
|
|
|
</head>
|
|
<body>
|
|
<div class="mobile-nav">
|
|
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
|
|
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
|
|
<label for="menuToggler" class="toggler__label">
|
|
<span></span>
|
|
</label>
|
|
<nav class="nav-content" role="navigation">
|
|
<a href="https://www.python.org/" class="nav-logo">
|
|
<img src="../_static/py.svg" alt="Logo"/>
|
|
</a>
|
|
<div class="version_switcher_placeholder"></div>
|
|
<form role="search" class="search" action="../search.html" method="get">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
|
|
<path fill-rule="nonzero"
|
|
d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" fill="#444"></path>
|
|
</svg>
|
|
<input type="text" name="q" aria-label="快速搜索"/>
|
|
<input type="submit" value="转向"/>
|
|
</form>
|
|
</nav>
|
|
<div class="menu-wrapper">
|
|
<nav class="menu" role="navigation" aria-label="main navigation">
|
|
<div class="language_switcher_placeholder"></div>
|
|
<h3><a href="../contents.html">目录</a></h3>
|
|
<ul>
|
|
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">asynchat</span></code> --- 异步套接字指令/响应处理程序</a><ul>
|
|
<li><a class="reference internal" href="#asynchat-example">asynchat 示例</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
<h4>上一个主题</h4>
|
|
<p class="topless"><a href="asyncore.html"
|
|
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncore</span></code> --- 异步套接字处理器</a></p>
|
|
<h4>下一个主题</h4>
|
|
<p class="topless"><a href="signal.html"
|
|
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">signal</span></code> --- 设置异步事件处理程序</a></p>
|
|
<div role="note" aria-label="source link">
|
|
<h3>本页</h3>
|
|
<ul class="this-page-menu">
|
|
<li><a href="../bugs.html">报告 Bug</a></li>
|
|
<li>
|
|
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/asynchat.rst"
|
|
rel="nofollow">显示源代码
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
|
|
这个文档所针对的是一个已不再受支持的 Python 旧版本。
|
|
你应当升级版本,并阅读
|
|
<a href="/3/library/asynchat.html"> Python 当前稳定版本的文档</a>.
|
|
</div>
|
|
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>导航</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../genindex.html" title="总目录"
|
|
accesskey="I">索引</a></li>
|
|
<li class="right" >
|
|
<a href="../py-modindex.html" title="Python 模块索引"
|
|
>模块</a> |</li>
|
|
<li class="right" >
|
|
<a href="signal.html" title="signal --- 设置异步事件处理程序"
|
|
accesskey="N">下一页</a> |</li>
|
|
<li class="right" >
|
|
<a href="asyncore.html" title="asyncore --- 异步套接字处理器"
|
|
accesskey="P">上一页</a> |</li>
|
|
|
|
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
|
|
<li><a href="https://www.python.org/">Python</a> »</li>
|
|
<li class="switchers">
|
|
<div class="language_switcher_placeholder"></div>
|
|
<div class="version_switcher_placeholder"></div>
|
|
</li>
|
|
<li>
|
|
|
|
</li>
|
|
<li id="cpython-language-and-version">
|
|
<a href="../index.html">3.8.20 Documentation</a> »
|
|
</li>
|
|
|
|
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="ipc.html" accesskey="U">网络和进程间通信</a> »</li>
|
|
<li class="right">
|
|
|
|
|
|
<div class="inline-search" role="search">
|
|
<form class="inline-search" action="../search.html" method="get">
|
|
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
|
<input type="submit" value="转向" />
|
|
<input type="hidden" name="check_keywords" value="yes" />
|
|
<input type="hidden" name="area" value="default" />
|
|
</form>
|
|
</div>
|
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<section id="module-asynchat">
|
|
<span id="asynchat-asynchronous-socket-command-response-handler"></span><h1><a class="reference internal" href="#module-asynchat" title="asynchat: Support for asynchronous command/response protocols."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asynchat</span></code></a> --- 异步套接字指令/响应处理程序<a class="headerlink" href="#module-asynchat" title="永久链接至标题">¶</a></h1>
|
|
<p><strong>源代码:</strong> <a class="reference external" href="https://github.com/python/cpython/tree/3.8/Lib/asynchat.py">Lib/asynchat.py</a></p>
|
|
<div class="deprecated">
|
|
<p><span class="versionmodified deprecated">3.6 版后已移除: </span>请使用 <a class="reference internal" href="asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a> 替代。</p>
|
|
</div>
|
|
<hr class="docutils" />
|
|
<div class="admonition note">
|
|
<p class="admonition-title">注解</p>
|
|
<p>该模块仅为提供向后兼容。我们推荐在新代码中使用 <a class="reference internal" href="asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a> 。</p>
|
|
</div>
|
|
<p>此模块在 <a class="reference internal" href="asyncore.html#module-asyncore" title="asyncore: A base class for developing asynchronous socket handling services."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncore</span></code></a> 框架之上构建,简化了异步客户端和服务器并使得处理元素为以任意字符串结束或者为可变长度的协议更加容易。 <a class="reference internal" href="#module-asynchat" title="asynchat: Support for asynchronous command/response protocols."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asynchat</span></code></a> 定义了一个可以由你来子类化的抽象类 <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a>,提供了 <code class="xref py py-meth docutils literal notranslate"><span class="pre">collect_incoming_data()</span></code> 和 <code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code> 等方法的实现。 它使用与 <a class="reference internal" href="asyncore.html#module-asyncore" title="asyncore: A base class for developing asynchronous socket handling services."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncore</span></code></a> 相同的异步循环,并且可以在通道映射中自由地混合 <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a> 和 <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">asynchat.async_chat</span></code></a> 这两种类型的通道。 一般来说 <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a> 服务器通道在接收到传入的连接请求时会生成新的 <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">asynchat.async_chat</span></code></a> 通道对象。</p>
|
|
<dl class="class">
|
|
<dt id="asynchat.async_chat">
|
|
<em class="property">class </em><code class="sig-prename descclassname">asynchat.</code><code class="sig-name descname">async_chat</code><a class="headerlink" href="#asynchat.async_chat" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>这个类是 <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a> 的抽象子类。 对于实际使用的代码你必须子类化 <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a>,提供有意义的 <a class="reference internal" href="#asynchat.async_chat.collect_incoming_data" title="asynchat.async_chat.collect_incoming_data"><code class="xref py py-meth docutils literal notranslate"><span class="pre">collect_incoming_data()</span></code></a> 和 <a class="reference internal" href="#asynchat.async_chat.found_terminator" title="asynchat.async_chat.found_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code></a> 方法。 <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a> 的方法也可以被使用,但它们在消息/响应上下文中并不是全都有意义。</p>
|
|
<p>与 <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a> 类似,<a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> 也定义了一组通过对 <code class="xref c c-func docutils literal notranslate"><span class="pre">select()</span></code> 调用之后的套接字条件进行分析所生成的事件。 一旦启动轮询循环 <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> 对象的方法就会被事件处理框架调用而无须程序员方面做任何操作。</p>
|
|
<p>两个可被修改的类属性,用以提升性能,甚至也可能会节省内存。</p>
|
|
<dl class="data">
|
|
<dt id="asynchat.async_chat.ac_in_buffer_size">
|
|
<code class="sig-name descname">ac_in_buffer_size</code><a class="headerlink" href="#asynchat.async_chat.ac_in_buffer_size" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>异步输入缓冲区大小 (默认为 <code class="docutils literal notranslate"><span class="pre">4096</span></code>)。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="data">
|
|
<dt id="asynchat.async_chat.ac_out_buffer_size">
|
|
<code class="sig-name descname">ac_out_buffer_size</code><a class="headerlink" href="#asynchat.async_chat.ac_out_buffer_size" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>异步输出缓冲区大小 (默认为 <code class="docutils literal notranslate"><span class="pre">4096</span></code>)。</p>
|
|
</dd></dl>
|
|
|
|
<p>与 <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a> 不同,<a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> 允许你定义一个 <abbr title="先进先出">FIFO</abbr> 队列 <em>producers</em>。 其中的生产者只需要一个方法 <code class="xref py py-meth docutils literal notranslate"><span class="pre">more()</span></code>,该方法应当返回要在通道上传输的数据。 生产者通过让其 <code class="xref py py-meth docutils literal notranslate"><span class="pre">more()</span></code> 方法返回空字节串对象来表明其处于耗尽状态 (<em>意即</em> 它已不再包含数据)。 此时 <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> 对象会将该生产者从队列中移除并开始使用下一个生产者,如果有下一个的话。 当生产者队列为空时 <code class="xref py py-meth docutils literal notranslate"><span class="pre">handle_write()</span></code> 方法将不执行任何操作。 你要使用通道对象的 <a class="reference internal" href="#asynchat.async_chat.set_terminator" title="asynchat.async_chat.set_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">set_terminator()</span></code></a> 方法来描述如何识别来自远程端点的入站传输的结束或是重要的中断点。</p>
|
|
<p>要构建一个可用的 <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> 子类,你的输入方法 <a class="reference internal" href="#asynchat.async_chat.collect_incoming_data" title="asynchat.async_chat.collect_incoming_data"><code class="xref py py-meth docutils literal notranslate"><span class="pre">collect_incoming_data()</span></code></a> 和 <a class="reference internal" href="#asynchat.async_chat.found_terminator" title="asynchat.async_chat.found_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code></a> 必须要处理通道异步接收的数据。 这些参数的描述见下文。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="asynchat.async_chat.close_when_done">
|
|
<code class="sig-prename descclassname">async_chat.</code><code class="sig-name descname">close_when_done</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.close_when_done" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>将 <code class="docutils literal notranslate"><span class="pre">None</span></code> 推入生产者队列。 当此生产者被弹出队列时它将导致通道被关闭。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="asynchat.async_chat.collect_incoming_data">
|
|
<code class="sig-prename descclassname">async_chat.</code><code class="sig-name descname">collect_incoming_data</code><span class="sig-paren">(</span><em class="sig-param">data</em><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.collect_incoming_data" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>调用时附带 <em>data</em>,其中包含任意数量的已接收数据。 必须被重载的默认方法将引发一个 <a class="reference internal" href="exceptions.html#NotImplementedError" title="NotImplementedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NotImplementedError</span></code></a> 异常。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="asynchat.async_chat.discard_buffers">
|
|
<code class="sig-prename descclassname">async_chat.</code><code class="sig-name descname">discard_buffers</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.discard_buffers" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>在紧急情况下此方法将丢弃输入和/或输出缓冲区以及生产者队列中的任何数据。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="asynchat.async_chat.found_terminator">
|
|
<code class="sig-prename descclassname">async_chat.</code><code class="sig-name descname">found_terminator</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.found_terminator" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>当输入数据流能匹配 <a class="reference internal" href="#asynchat.async_chat.set_terminator" title="asynchat.async_chat.set_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">set_terminator()</span></code></a> 所设定的终结条件时会被调用。 必须被重载的默认方法将引发一个 <a class="reference internal" href="exceptions.html#NotImplementedError" title="NotImplementedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NotImplementedError</span></code></a> 异常。 被缓冲的输入数据应当可以通过实例属性来获取。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="asynchat.async_chat.get_terminator">
|
|
<code class="sig-prename descclassname">async_chat.</code><code class="sig-name descname">get_terminator</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.get_terminator" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>返回通道的当前终结器。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="asynchat.async_chat.push">
|
|
<code class="sig-prename descclassname">async_chat.</code><code class="sig-name descname">push</code><span class="sig-paren">(</span><em class="sig-param">data</em><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.push" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>将数据推入通道的队列以确保其被传输。 要让通道将数据写到网络中你只需要这样做就足够了,虽然以更复杂的方式使用你自己的生产者也是有可能的,例如为了实现加密和分块。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="asynchat.async_chat.push_with_producer">
|
|
<code class="sig-prename descclassname">async_chat.</code><code class="sig-name descname">push_with_producer</code><span class="sig-paren">(</span><em class="sig-param">producer</em><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.push_with_producer" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>获取一个生产者对象并将其加入到与通道相关联的生产者队列中。 当所有当前已推入的生产者都已被耗尽时通道将通过调用其 <code class="xref py py-meth docutils literal notranslate"><span class="pre">more()</span></code> 方法来耗用此生产者的数据并将数据发送至远程端点。</p>
|
|
</dd></dl>
|
|
|
|
<dl class="method">
|
|
<dt id="asynchat.async_chat.set_terminator">
|
|
<code class="sig-prename descclassname">async_chat.</code><code class="sig-name descname">set_terminator</code><span class="sig-paren">(</span><em class="sig-param">term</em><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.set_terminator" title="永久链接至目标">¶</a></dt>
|
|
<dd><p>设置可在通道上被识别的终结条件。 <code class="docutils literal notranslate"><span class="pre">term</span></code> 可以是三种类型值中的任意一种 ,对应于处理入站协议数据的三种不同方式。</p>
|
|
<table class="docutils align-default">
|
|
<colgroup>
|
|
<col style="width: 20%" />
|
|
<col style="width: 80%" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr class="row-odd"><th class="head"><p>term</p></th>
|
|
<th class="head"><p>描述</p></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="row-even"><td><p><em>string</em></p></td>
|
|
<td><p>当在输入流中发现该字符串时将会调用 <a class="reference internal" href="#asynchat.async_chat.found_terminator" title="asynchat.async_chat.found_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code></a></p></td>
|
|
</tr>
|
|
<tr class="row-odd"><td><p><em>integer</em></p></td>
|
|
<td><p>当接收到指定数量的字符时将会调用 <a class="reference internal" href="#asynchat.async_chat.found_terminator" title="asynchat.async_chat.found_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code></a></p></td>
|
|
</tr>
|
|
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">None</span></code></p></td>
|
|
<td><p>通道会不断地持续收集数据</p></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>请注意终结器之后的任何数据将可在 <a class="reference internal" href="#asynchat.async_chat.found_terminator" title="asynchat.async_chat.found_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code></a> 被调用后由通道来读取。</p>
|
|
</dd></dl>
|
|
|
|
<section id="asynchat-example">
|
|
<span id="id1"></span><h2>asynchat 示例<a class="headerlink" href="#asynchat-example" title="永久链接至标题">¶</a></h2>
|
|
<p>下面的例子片段显示了如何通过 <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> 来读取 HTTP 请求。 Web 服务器可以为每个入站的客户端连接创建 <code class="xref py py-class docutils literal notranslate"><span class="pre">http_request_handler</span></code> 对象。 请注意在初始时通道终结器会被设置为匹配 HTTP 标头末尾的空行,并且会用一个旗标来指明标头正在被读取。</p>
|
|
<p>一旦完成了标头的读取,如果请求类型为 POST (表明输入流中存在更多的数据) 则会使用 <code class="docutils literal notranslate"><span class="pre">Content-Length:</span></code> 标头来设置一个数值终结器以从通道读取适当数量的数据。</p>
|
|
<p>一旦完成了对所有相关输入的处理,将会在设置通道终结器为 <code class="docutils literal notranslate"><span class="pre">None</span></code> 以确保忽略掉 Web 客户端所发送的任何无关数据之后调用 <code class="xref py py-meth docutils literal notranslate"><span class="pre">handle_request()</span></code> 方法。</p>
|
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">asynchat</span>
|
|
|
|
<span class="k">class</span> <span class="nc">http_request_handler</span><span class="p">(</span><span class="n">asynchat</span><span class="o">.</span><span class="n">async_chat</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sock</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">sessions</span><span class="p">,</span> <span class="n">log</span><span class="p">):</span>
|
|
<span class="n">asynchat</span><span class="o">.</span><span class="n">async_chat</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sock</span><span class="o">=</span><span class="n">sock</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">addr</span> <span class="o">=</span> <span class="n">addr</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">sessions</span> <span class="o">=</span> <span class="n">sessions</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obuffer</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">set_terminator</span><span class="p">(</span><span class="sa">b</span><span class="s2">"</span><span class="se">\r\n\r\n</span><span class="s2">"</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">reading_headers</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">handling</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cgi_data</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">log</span> <span class="o">=</span> <span class="n">log</span>
|
|
|
|
<span class="k">def</span> <span class="nf">collect_incoming_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Buffer the data"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">found_terminator</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reading_headers</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">reading_headers</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">parse_headers</span><span class="p">(</span><span class="sa">b</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="sa">b</span><span class="s2">"POST"</span><span class="p">:</span>
|
|
<span class="n">clen</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">getheader</span><span class="p">(</span><span class="s2">"content-length"</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">set_terminator</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">clen</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">handling</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">set_terminator</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">handle_request</span><span class="p">()</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">handling</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">set_terminator</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span> <span class="c1"># browsers sometimes over-send</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cgi_data</span> <span class="o">=</span> <span class="n">parse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">,</span> <span class="sa">b</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">handling</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">handle_request</span><span class="p">()</span>
|
|
</pre></div>
|
|
</div>
|
|
</section>
|
|
</section>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<h3><a href="../contents.html">目录</a></h3>
|
|
<ul>
|
|
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">asynchat</span></code> --- 异步套接字指令/响应处理程序</a><ul>
|
|
<li><a class="reference internal" href="#asynchat-example">asynchat 示例</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
<h4>上一个主题</h4>
|
|
<p class="topless"><a href="asyncore.html"
|
|
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncore</span></code> --- 异步套接字处理器</a></p>
|
|
<h4>下一个主题</h4>
|
|
<p class="topless"><a href="signal.html"
|
|
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">signal</span></code> --- 设置异步事件处理程序</a></p>
|
|
<div role="note" aria-label="source link">
|
|
<h3>本页</h3>
|
|
<ul class="this-page-menu">
|
|
<li><a href="../bugs.html">报告 Bug</a></li>
|
|
<li>
|
|
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/asynchat.rst"
|
|
rel="nofollow">显示源代码
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></div>
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>导航</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../genindex.html" title="总目录"
|
|
>索引</a></li>
|
|
<li class="right" >
|
|
<a href="../py-modindex.html" title="Python 模块索引"
|
|
>模块</a> |</li>
|
|
<li class="right" >
|
|
<a href="signal.html" title="signal --- 设置异步事件处理程序"
|
|
>下一页</a> |</li>
|
|
<li class="right" >
|
|
<a href="asyncore.html" title="asyncore --- 异步套接字处理器"
|
|
>上一页</a> |</li>
|
|
|
|
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
|
|
<li><a href="https://www.python.org/">Python</a> »</li>
|
|
<li class="switchers">
|
|
<div class="language_switcher_placeholder"></div>
|
|
<div class="version_switcher_placeholder"></div>
|
|
</li>
|
|
<li>
|
|
|
|
</li>
|
|
<li id="cpython-language-and-version">
|
|
<a href="../index.html">3.8.20 Documentation</a> »
|
|
</li>
|
|
|
|
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="ipc.html" >网络和进程间通信</a> »</li>
|
|
<li class="right">
|
|
|
|
|
|
<div class="inline-search" role="search">
|
|
<form class="inline-search" action="../search.html" method="get">
|
|
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
|
<input type="submit" value="转向" />
|
|
<input type="hidden" name="check_keywords" value="yes" />
|
|
<input type="hidden" name="area" value="default" />
|
|
</form>
|
|
</div>
|
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</div>
|
|
<div class="footer">
|
|
© <a href="../copyright.html">版权所有</a> 2001-2024, Python Software Foundation.
|
|
<br />
|
|
This page is licensed under the Python Software Foundation License Version 2.
|
|
<br />
|
|
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
|
|
<br />
|
|
|
|
<br />
|
|
|
|
The Python Software Foundation is a non-profit corporation.
|
|
<a href="https://www.python.org/psf/donations/">Please donate.</a>
|
|
<br />
|
|
<br />
|
|
|
|
最后更新于 12月 09, 2024.
|
|
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
|
|
<br />
|
|
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
|
|
</div>
|
|
|
|
</body>
|
|
</html> |