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 ElementTree 基本读操作示例
Apr 09 Python
python获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Python制作简单的网页爬虫
Nov 22 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
Django框架HttpRequest对象用法实例分析
Nov 01 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 Python
Python如何绘制日历图和热力图
Aug 07 Python
Python道路车道线检测的实现
Jun 27 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
php5新改动之短标记启用方法
2008/09/11 PHP
php之对抗Web扫描器的脚本技巧
2008/10/01 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
jQuery 渐变下拉菜单
2009/12/15 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
tornado 多进程模式解析
2018/01/15 Python
Python实现自动上京东抢手机
2018/02/06 Python
对pandas中to_dict的用法详解
2018/06/05 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
如何在python中写hive脚本
2019/11/08 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
Python reversed函数及使用方法解析
2020/03/17 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
2014年预备党员学习两会心得体会
2014/03/17 职场文书
公务员保密承诺书
2014/03/27 职场文书
节能减排倡议书
2014/04/15 职场文书
机房搬迁方案
2014/05/01 职场文书
中国梦口号
2014/06/13 职场文书
护理目标管理责任书
2014/07/25 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
基层党建工作简报
2015/07/21 职场文书