<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>Thoughts from Mads Sülau Jørgensen &#187; asyncore</title> <atom:link href="http://madssj.com/blog/tag/asyncore/feed/" rel="self" type="application/rss+xml" /><link>http://madssj.com/blog</link> <description>Various articles about programming and systems administration.</description> <lastBuildDate>Mon, 27 Jun 2011 08:54:43 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Asynchronous socket server in python</title><link>http://madssj.com/blog/2008/02/21/asynchronous-socket-server-in-python/</link> <comments>http://madssj.com/blog/2008/02/21/asynchronous-socket-server-in-python/#comments</comments> <pubDate>Thu, 21 Feb 2008 14:39:52 +0000</pubDate> <dc:creator>Mads Sülau Jørgensen</dc:creator> <category><![CDATA[Programming]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[Work]]></category> <category><![CDATA[asynchat]]></category> <category><![CDATA[asyncore]]></category> <category><![CDATA[server]]></category> <category><![CDATA[socket]]></category> <guid
isPermaLink="false">http://swag.dk/blog/2008/02/21/asynchronous-socket-server-in-python/</guid> <description><![CDATA[The code for a very simple asynchronous socket server written in python utilizing the asynchat module. It&#8217;s all in good fun. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 &#8230; <a
href="http://madssj.com/blog/2008/02/21/asynchronous-socket-server-in-python/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>The code for a very simple asynchronous socket server written in python utilizing the asynchat module. It&#8217;s all in good fun.</p><p><span
id="more-8"></span></p><div
class="wp_syntax"><table><tr><td
class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
</pre></td><td
class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">asyncore</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">asynchat</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">socket</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Lobby<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">clients</span> = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> leave<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, client<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">clients</span>.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>client<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> join<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, client<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">clients</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>client<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> send_to_all<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> client <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">clients</span>:
            client.<span style="color: black;">push</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Client<span style="color: black;">&#40;</span><span style="color: #dc143c;">asynchat</span>.<span style="color: black;">async_chat</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, conn, lobby<span style="color: black;">&#41;</span>:
        <span style="color: #dc143c;">asynchat</span>.<span style="color: black;">async_chat</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, sock=conn<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">in_buffer</span> = <span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">set_terminator</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;n&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span> = lobby
        <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> collect_incoming_data<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">in_buffer</span> += data
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> found_terminator<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">in_buffer</span>.<span style="color: black;">rstrip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">&quot;QUIT&quot;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span>.<span style="color: black;">leave</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">close_when_done</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span>.<span style="color: black;">send_to_all</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">in_buffer</span> + <span style="color: #008000;">self</span>.<span style="color: black;">terminator</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">in_buffer</span> = <span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Server<span style="color: black;">&#40;</span><span style="color: #dc143c;">asynchat</span>.<span style="color: black;">async_chat</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #dc143c;">asynchat</span>.<span style="color: black;">async_chat</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">create_socket</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">AF_INET</span>, <span style="color: #dc143c;">socket</span>.<span style="color: black;">SOCK_STREAM</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">set_reuse_addr</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">bind</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;127.0.0.1&quot;</span>, <span style="color: #ff4500;">12345</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listen</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span> = <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> set_lobby<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, lobby<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span> = lobby
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> handle_accept<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        sock, addr = <span style="color: #008000;">self</span>.<span style="color: black;">accept</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        client = Client<span style="color: black;">&#40;</span>sock, <span style="color: #008000;">self</span>.<span style="color: black;">lobby</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    lobby = Lobby<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    server = Server<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    server.<span style="color: black;">set_lobby</span><span style="color: black;">&#40;</span>lobby<span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">asyncore</span>.<span style="color: black;">loop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div><p>Booting the server is a matter of <code>python echoserver.py</code>.</p><p>After that, telnet can be used to induce messages, as such:<pre>
$ telnet localhost 12345
foo
foo</pre>The same will be true for any amount of clients. This is so simple. Love it.</p> ]]></content:encoded> <wfw:commentRss>http://madssj.com/blog/2008/02/21/asynchronous-socket-server-in-python/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> </channel> </rss>
