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使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
python实现将文本转换成语音的方法
May 28 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
Python实现的多进程拷贝文件并显示百分比功能示例
Apr 09 Python
python3对接mysql数据库实例详解
Apr 30 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
Python日志syslog使用原理详解
Feb 18 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
python实战之90行代码写个猜数字游戏
Apr 22 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 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
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
2019/08/05 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
Django日志模块logging的配置详解
2017/02/14 Python
django框架如何集成celery进行开发
2017/05/24 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
python匿名函数的使用方法解析
2019/10/10 Python
Python多线程多进程实例对比解析
2020/03/12 Python
Python pandas如何向excel添加数据
2020/05/22 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
党课学习思想汇报
2014/01/02 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis