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 相关文章推荐
PyCharm代码格式调整方法
May 23 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
Python 从相对路径下import的方法
Dec 04 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 Python
seek引发的python文件读写的问题及解决
Jul 26 Python
Django models.py应用实现过程详解
Jul 29 Python
Python常用数据类型之间的转换总结
Sep 06 Python
keras多显卡训练方式
Jun 10 Python
Python下划线5种含义代码实例解析
Jul 10 Python
python中append函数用法讲解
Dec 11 Python
ubuntu安装jupyter并设置远程访问的实现
Mar 31 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
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
基于python实现百度翻译功能
2019/05/09 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
python批量处理文件或文件夹
2020/07/28 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
如何进行Linux分区优化
2016/09/13 面试题
大学自我鉴定
2013/12/20 职场文书
2014年维修工作总结
2014/11/22 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android