「Pythonでsocket通信を行いたい」
「PythonでSSH接続を行いたい」
「Pythonでネットワークプログラミングを行いたい」
このような場合には、Twistedがオススメです。
この記事では、Twistedについて解説しています。
本記事の内容
- Twistedとは?
- Twistedのシステム要件
- Twistedのインストール
- Twistedの動作確認
それでは、上記に沿って解説していきます。
Twistedとは?
Twistedとは、Pythonで書かれた非同期ネットワーキング・フレームワークです。
Twistedには、以下の機能が用意されています。
- twisted.web: HTTP clients and servers, HTML templating, and a WSGI server
- twisted.conch: SSHv2 and Telnet clients and servers and terminal emulators
- twisted.words: Clients and servers for IRC, XMPP, and other IM protocols
- twisted.mail: IMAPv4, POP3, SMTP clients and servers
- twisted.positioning: Tools for communicating with NMEA-compatible GPS receivers
- twisted.names: DNS client and tools for making your own DNS servers
- twisted.trial: A unit testing framework that integrates well with Twisted-based code.
ネットワーク通信は、Twistedにお任せということです。
凝ったネットワーク通信を実現したい場合、Twistedがその効果を発揮するでしょう。
Twistedのドキュメントは、結構充実しています。
Twisted公式ドキュメント
https://docs.twisted.org/en/stable/core/index.html
Pythonでネットワークプログラミングを行いたい場合、上記ページが参考になります。
どちらかと言うと、Twistedは上級者向けのライブラリです。
以上、Twistedについて説明しました。
次は、Twistedのシステム要件を説明しました。
Twistedのシステム要件
現時点(2022年8月)でのTwistedの最新バージョンは、22.4.0となります。
この最新バージョンは、2022年4月11日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux
サポート対象となるPythonのバージョンは、以下となっています。
- Python 3.6
- Python 3.7
- Python 3.8
- Python 3.9
- Python 3.10
Python 3.6だけが、以下のPython公式開発サイクルとは異なります。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
Python 3.6のサポートは、2021年で終了していることに注意しましょう。
他には、システム要件はありません。
基本的には、Pythonが動けばOKと言えます。
以上、Twistedのシステム要件を説明しました。
次は、Twistedのインストールを説明します。
Twistedのインストール
検証は、次のバージョンのPythonで行います。
$ python -V Python 3.10.2
まずは、現状のインストール済みパッケージを確認しておきます。
$ pip list Package Version ---------- ------- pip 22.2.2 setuptools 65.0.1 wheel 0.36.2
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、Twistedのインストールです。
Twistedのインストールは、以下のコマンドとなります。
pip install Twisted
Twistedのインストールは、すぐに終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。
$ pip list Package Version ----------------- ------- attrs 22.1.0 Automat 20.2.0 constantly 15.1.0 hyperlink 21.0.0 idna 3.3 incremental 21.3.0 pip 22.2.2 setuptools 65.0.1 six 1.16.0 Twisted 22.4.0 typing_extensions 4.3.0 wheel 0.36.2 zope.interface 5.4.0
Twistedが依存するパッケージは、そこそこ存在しています。
インストールにおけるトラブルを防ぎたいなら、Python仮想環境の利用をオススメします。
以上、Twistedのインストールを説明しました。
次は、Twistedの動作確認を説明します。
Twistedの動作確認
Twistedの動作確認を行います。
Twistedを用いて、TCP接続をサーバー・クライアントで実現します。
そのためには、それぞれのスクリプトを用意します。
simpleserv.py
# Copyright (c) Twisted Matrix Laboratories. # See LICENSE for details. from twisted.internet import protocol, reactor class Echo(protocol.Protocol): """This is just about the simplest possible protocol""" def dataReceived(self, data): "As soon as any data is received, write it back." self.transport.write(data) def main(): """This runs the protocol on port 8000""" factory = protocol.ServerFactory() factory.protocol = Echo reactor.listenTCP(8000, factory) reactor.run() # this only runs if the module was *not* imported if __name__ == "__main__": main()
simpleclient.py
# Copyright (c) Twisted Matrix Laboratories. # See LICENSE for details. """ An example client. Run simpleserv.py first before running this. """ from twisted.internet import protocol, reactor # a client protocol class EchoClient(protocol.Protocol): """Once connected, send a message, then print the result.""" def connectionMade(self): self.transport.write(b"hello, world!") def dataReceived(self, data): "As soon as any data is received, write it back." print("Server said:", data) self.transport.loseConnection() def connectionLost(self, reason): print("connection lost") class EchoFactory(protocol.ClientFactory): protocol = EchoClient def clientConnectionFailed(self, connector, reason): print("Connection failed - goodbye!") reactor.stop() def clientConnectionLost(self, connector, reason): print("Connection lost - goodbye!") reactor.stop() # this connects the protocol to a server running on port 8000 def main(): f = EchoFactory() reactor.connectTCP("localhost", 8000, f) reactor.run() # this only runs if the module was *not* imported if __name__ == "__main__": main()
まずは、サーバーであるsimpleserv.pyを起動します。
$ python simpleserv.py
上記のように実行すると、待ちの状態になります。
この状態でsimpleclient.pyを実行します。
Server said: b'hello, world!' connection lost Connection lost - goodbye!
実行した結果は、上記のように表示されます。
このように表示されれ、TCP接続は成功しています。
simpleserv.pyが起動していない場合は、TCP接続は失敗します。
その場合にsimpleclient.pyを実行した結果は、以下となります。
Connection failed - goodbye!
上記のサンプルコードは、以下のページより取得しています。
https://docs.twisted.org/en/stable/core/examples/index.html
上記ページでは、他にも多くのサンプルコードが公開されています。
それらを利用して、Twistedの動作をさらに確認することが可能です。
以上、Twistedの動作確認を説明しました。