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 正则式使用心得
May 07 Python
Python读写Redis数据库操作示例
Mar 18 Python
详解在Python和IPython中使用Docker
Apr 28 Python
Python中getattr函数和hasattr函数作用详解
Jun 14 Python
Django中的Model操作表的实现
Jul 24 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
Python列表list常用内建函数实例小结
Oct 22 Python
Python面向对象封装操作案例详解
Dec 31 Python
使用python3 实现插入数据到mysql
Mar 02 Python
Keras 使用 Lambda层详解
Jun 10 Python
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
Apr 27 Python
python套接字socket通信
Apr 01 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 判断网页是否是utf8编码的方法
2014/06/06 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
详解php实现页面静态化原理
2017/06/21 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
2013/03/18 Javascript
javascript中常用编程知识
2013/04/08 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
python实现计算资源图标crc值的方法
2014/10/05 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
python调用摄像头显示图像的实例
2018/08/03 Python
python并发和异步编程实例
2018/11/15 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
python实现手势识别的示例(入门)
2020/04/15 Python
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
企业承诺书怎么写
2014/05/24 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
《窃读记》教学反思
2016/02/18 职场文书
小学教师教学反思
2016/02/24 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript