python 编程之twisted详解及简单实例


Posted in Python onJanuary 28, 2017

python 编程之twisted详解

前言:

 我不擅长写socket代码。一是用c写起来比较麻烦,二是自己平时也没有这方面的需求。等到自己真正想了解的时候,才发现自己在这方面确实有需要改进的地方。最近由于项目的原因需要写一些Python代码,才发现在python下面开发socket是一件多么爽的事情。

    对于大多数socket来说,用户其实只要关注三个事件就可以了。这分别是创建、删除、和收发数据。python中的twisted库正好可以帮助我们完成这么一个目标,实用起来也不麻烦。下面的代码来自twistedmatrix网站,我觉得挺不错的,贴在这里和大家分享一下。如果需要测试的话,直接telnet localhost 8123就可以了。如果需要在twisted中处理信号,可以先注册signal函数,在signal函数中调用reactor.stop(),后面twisted继续call stop_factory,这样就可以继续完成剩下的清理工作了。

from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
from twisted.internet import reactor 
 
class Chat(LineReceiver): 
 
  def __init__(self, users): 
    self.users = users 
    self.name = None 
    self.state = "GETNAME" 
 
  def connectionMade(self): 
    self.sendLine("What's your name?") 
 
  def connectionLost(self, reason): 
    if self.name in self.users: 
      del self.users[self.name] 
 
  def lineReceived(self, line): 
    if self.state == "GETNAME": 
      self.handle_GETNAME(line) 
    else: 
      self.handle_CHAT(line) 
 
  def handle_GETNAME(self, name): 
    if name in self.users: 
      self.sendLine("Name taken, please choose another.") 
      return 
    self.sendLine("Welcome, %s!" % (name,)) 
    self.name = name 
    self.users[name] = self 
    self.state = "CHAT" 
 
  def handle_CHAT(self, message): 
    message = "<%s> %s" % (self.name, message) 
    for name, protocol in self.users.iteritems(): 
      if protocol != self: 
        protocol.sendLine(message) 
 
 
class ChatFactory(Factory): 
 
  def __init__(self): 
    self.users = {} # maps user names to Chat instances 
 
  def buildProtocol(self, addr): 
    return Chat(self.users) 
 
  def startFactory(self): 
    print 'start' 
 
  def stopFactory(self): 
    print 'stop' 
 
reactor.listenTCP(8123, ChatFactory()) 
reactor.run()

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
python实现烟花小程序
Jan 30 Python
Python实现插入排序和选择排序的方法
May 12 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
Jul 15 Python
浅析Python语言自带的数据结构有哪些
Aug 27 Python
python入门之基础语法学习笔记
Feb 08 Python
python中HTMLParser模块知识点总结
Jan 25 Python
Django一小时写出账号密码管理系统
Apr 29 Python
详解python之简单主机批量管理工具
Jan 27 #Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 #Python
在Django同1个页面中的多表单处理详解
Jan 25 #Python
Python heapq使用详解及实例代码
Jan 25 #Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 #Python
Python调用C++程序的方法详解
Jan 24 #Python
python中import学习备忘笔记
Jan 24 #Python
You might like
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
php将会员数据导入到ucenter的代码
2010/07/18 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
node 命令方式启动修改端口的方法
2018/05/12 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
Python translator使用实例
2008/09/06 Python
在Python中使用列表生成式的教程
2015/04/27 Python
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
Python表示矩阵的方法分析
2017/05/26 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
实习教师自我鉴定
2013/09/27 职场文书
2014学年自我鉴定
2014/02/23 职场文书
英语教师岗位职责
2014/03/16 职场文书
《画风》教学反思
2014/04/16 职场文书
篮球社团活动总结
2014/06/27 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL