Python基于select实现的socket服务器


Posted in Python onApril 13, 2016

本文实例讲述了Python基于select实现的socket服务器。分享给大家供大家参考,具体如下:

借鉴了asyncore模块中select.select的使用方法

import socket
import traceback
import select
EOL1 = b'\n\n'
EOL2 = b'\n\r\n'
socketmap = {}
r,w,e = [],[],[]
response = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n'
response += b'Content-Type: text/plain\r\nContent-Length: 13\r\n\r\n'
response += b'Hello, world!'
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind(('0.0.0.0', 23456))
serversocket.listen(1)
#serversocket.setblocking(0)
listening_fileno = serversocket.fileno()
socketmap[listening_fileno] = serversocket
print 'listening_fileno',listening_fileno
try:
  while True:
    r,w,e = [],[],[]
    for fd in socketmap:
      r.append(fd)
      w.append(fd)
      e.append(fd)
    r,w,e = select.select(r,w,e,1)
    for fd in r:
      request = b''
      isocket = socketmap[fd]
      if fd == listening_fileno:
        print 'accepting'
        clientsock,clientaddr = isocket.accept()
        #clientsock.setblocking(0)
        cli_fileno = clientsock.fileno()
        r.append(cli_fileno)
        w.append(cli_fileno)
        e.append(cli_fileno)
        socketmap[cli_fileno] = clientsock
      else:
        print 'reading'
        while EOL1 not in request and EOL2 not in request:
          request += isocket.recv(1024)
        print(request.decode())
    for fd in w:
      print 'writing'
      osocket = socketmap[fd]
      osocket.send(response)
    for fd in e:
      esocket = socketmap[fd]
      print 'socket close',fd
      esocket.close()
      del socketmap[fd]
    print "no data coming"
except Exception,e:
  print traceback.print_exc()
  serversocket.close()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python操作MySQL数据库的三种方法总结
Jan 30 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
Sanic框架应用部署方法详解
Jul 18 Python
python requests post多层字典的方法
Dec 27 Python
基于python实现高速视频传输程序
May 05 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
python绘制直方图和密度图的实例
Jul 08 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 Python
python框架flask表单实现详解
Nov 04 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 Python
最新Python idle下载、安装与使用教程图文详解
Nov 28 Python
Python帮你解决手机qq微信内存占用太多问题
Feb 15 Python
Python简单实现子网掩码转换的方法
Apr 13 #Python
Python多进程分块读取超大文件的方法
Apr 13 #Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 #Python
Python字符串格式化输出方法分析
Apr 13 #Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 #Python
python 实时遍历日志文件
Apr 12 #Python
python字符串连接方法分析
Apr 12 #Python
You might like
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
PHP var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
php处理文件的小例子(解压缩,删除目录)
2013/02/03 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
PHP的关于变量和日期处理的一些面试题目整理
2015/08/10 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
2018/02/18 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
旷课检讨书3000字
2014/02/04 职场文书
生产文员岗位职责
2014/04/05 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
电工实训心得体会
2016/01/14 职场文书
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS