Today I tested two python modules named:
twisted and
twisted[tls].
Twisted is an event-driven network programming framework written in Python and licensed under the MIT License.
Twisted projects variously support TCP, UDP, SSL/TLS, IP multicast, Unix domain sockets, many protocols (including HTTP, XMPP, NNTP, IMAP, SSH, IRC, FTP, and others), and much more. Twisted is based on the event-driven programming paradigm, which means that users of Twisted write short callbacks which are called by the framework., see
wikipedia webpage.
In this tutorial I will show you only some of these tests and how you can work with these python modules.
About
twisted you can read more at
the official webpage.
In Fedora distro version 33 you can use the
dnf tool to search for and install these python packages.
[root@desk mythcat]# dnf search twisted
...
python3-twisted.x86_64 : Twisted is a networking engine written in Python
python3-twisted+tls.x86_64 : Metapackage for python3-twisted: tls extras
You can also use the
pip tool for installation:
[mythcat@desk ~]$ cd PythonProjects/
[mythcat@desk PythonProjects]$ pip3 install twisted
...
[mythcat@desk PythonProjects]$ pip3 install twisted[tls]
...
I used python 3.9.0 to test if this python package works:
[mythcat@desk PythonProjects]$ python3.9
Python 3.9.0 (default, Oct 6 2020, 00:00:00)
[GCC 10.2.1 20200826 (Red Hat 10.2.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from twisted.protocols import basic
Let's test with simple example using the reactor and protocol:
from twisted.internet import reactor, protocol
class ClientEcho(protocol.Protocol):
def connectionMade(self):
self.transport.write("Hello, world!".encode('utf-8'))
def dataReceived(self, data):
print ("Server: ", data)
self.transport.loseConnection()
class FactoryEcho(protocol.ClientFactory):
def buildProtocol(self, addr):
return ClientEcho()
def clientConnectionFailed(self, connector, reason):
print ("Connection failed")
reactor.stop()
def clientConnectionLost(self, connector, reason):
print ("Connection lost")
reactor.stop()
reactor.connectTCP("localhost", 8080, FactoryEcho())
reactor.run()
Your protocol handling class will usually subclass
twisted.internet.protocol.Protocol.
The default factory class
twisted.internet.protocol.Factory just instantiates each
Protocol and lets every
Protocol access, and possibly modify, the persistent configuration.
This protocol responds to the initial connection with a well known quote, and then terminates the connection.
The protocol never waits for an event because handles data in an asynchronous manner.
The reactor interface lets many different loops handle the networking code.
The source code have two classes each is used to show a simple echo client on port 8080 - you can use any port.
This source code is the most simple example to understand the relation between factory , protocol and reactor.
The result is this:
[mythcat@desk PythonProjects]$ python3.9 echo_client_001.py
Server: b'Hello, world!'
Connection lost