1. twisted简介:
twisted是一个网络开发框架,可以开发完整的异步网络应用程序和协议,因为twisted提供了网络协议,线程,安全性和身份验证,IM,DBMS数据库集成,WEB,EMAIL,GUI集成开发工具...等一系列组件提供给开发这使用,它是一个完整的事件驱动的网络框架。
2.twisted的特点:
从twisted简介中可以看出,twisted具有以下特点:
.作为框架,支持各种网络协议,例如:TCP/IP,UDP,SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP;
.提供了GUI集成开发工具,同时,也提供了各种协议的服务端和客户端的实现;
.基于事件驱动,事件是twisted运转的核心,是发生各种动作的启动器;
.跨平台,twisted是一个跨平台的网络应用程序开发框架。
3.twisted的安装:
由于twisted不是python标准库,所以需要手动安装,用pip install twisted命令进行安装,方法如下:
pip install twisted
#如果提示“ERROR:...Consider using the `--user` option or check the permissions.”,则加上 --user参数,如下:
pip install twisted --user
也可以参考如下链接:
python3可视化-pyecharts的安装出错,“ERROR: Could not install packages due to an EnvironmentError: [Errno 13]“_liranke的专栏-CSDN博客利用pyecharts可以制作可视化图形。网址:https://github.com/pyecharts/pyecharts。安装出错:Installing collected packages: MarkupSafe, jinja2, wcwidth, prettytable, simplejson, pyechartsERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission deniedhttps://blog.csdn.net/liranke/article/details/119817780
3.twisted案例:一个简单的TCP链接的实现,包括服务端和客户端
程序功能:客户端发消息给服务端,服务端将收到消息的时间和收到的消息一起发送给客户端。
程序清单:
server端代码(wisted_server.py):
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
from twisted.internet.protocol import Protocol, ClientFactory
from twisted.internet import reactor
# from twisted.python.compat import raw_input
IP_HOST = "127.0.0.1"
IP_PORT = 7777
class MyClientProtocol(Protocol):
def sendData(self):
data = input("> ") # raw_input
if data:
print("send: %s" % data)
self.transport.write(str.encode(data))
else:
self.transport.loseConnection()
def connectionMade(self):
print("connectionMade of client")
self.sendData()
def dataReceived(self, data):
print("recv:" + data.decode())
self.sendData()
class MyClientFactory(ClientFactory):
protocol = MyClientProtocol
clientConnectionLost = clientConnectionFailed = \
lambda self, connector, reason: reactor.stop()
# main function
if __name__ == '__main__':
print("======twisted client main begin======")
print("connect server...")
reactor.connectTCP(IP_HOST, IP_PORT, MyClientFactory())
reactor.run()
client端代码(twisted_client.py):
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
from time import ctime
IP_PORT = 7777
clients = []
class MyServerProtocol(Protocol):
def connectionMade(self):
clnt = self.clnt = self.transport.getPeer().host
print("connected from:" + clnt)
# self.factory.numProtocols = self.factory.numProtocols + 1
# self.transport.write(
# "欢迎来到Spread Site, 你是第%s个客户端用户!\n" % (self.factory.numProtocols)
# )
# print
# "new connect: %d" % (self.factory.numProtocols)
# clients.append(self)
def connectionLost(self, reason):
print("lost connection")
# self.factory.numProtocols = self.factory.numProtocols - 1
# clients.remove(self)
# print("lost connect: %d" % (self.factory.numProtocols))
def dataReceived(self, data):
data_str = data.decode()
print("dataReceived:" + data_str)
if data_str == "quit":
self.transport.loseConnection()
else:
send_str = '[%s] %s' % (ctime(), data_str)
send_bytes = str.encode(send_str)
#print("data send:" + data_str)
self.transport.write(send_bytes)
#main function
if __name__ == '__main__':
print("======twisted server main begin======")
factory = Factory()
factory.protocol = MyServerProtocol
print("listent...")
reactor.listenTCP(IP_PORT, factory)
reactor.run()
运行结果:
server端运行结果:
python twisted_server.py
======twisted server main begin======
listent...
connected from:127.0.0.1
dataReceived:12345
dataReceived:qwert
dataReceived:quit
lost connection
client端运行结果:
python twisted_client.py
======twisted client main begin======
connect server...
connectionMade of client
> 12345
send: 12345
recv:[Wed Sep 29 08:59:48 2021] 12345
> qwert
send: qwert
recv:[Wed Sep 29 08:59:50 2021] qwert
> quit
send: quitProcess finished with exit code 0
利用成熟的框架,不必重新建轮子。