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中操作时间之tzset()方法的使用教程
May 22 Python
python if not in 多条件判断代码
Sep 21 Python
python查看模块安装位置的方法
Oct 16 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
python求最大值,不使用内置函数的实现方法
Jul 09 Python
django获取from表单multiple-select的value和id的方法
Jul 19 Python
python中seaborn包常用图形使用详解
Nov 25 Python
Django 多对多字段的更新和插入数据实例
Mar 31 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
解决PyCharm无法使用lxml库的问题(图解)
Dec 22 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
javascript 进度条 实现代码
2009/07/30 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
JavaScript实现经典排序算法之选择排序
2016/12/28 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
JS仿JQuery选择器功能
2017/03/08 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
Angular4 反向代理Details实践
2018/05/30 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
六个窍门助你提高Python运行效率
2015/06/09 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
flask框架路由常用定义方式总结
2019/07/23 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
读书伴我成长演讲稿
2014/05/07 职场文书
房地产销售助理岗位职责
2015/04/14 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript
一篇文章弄懂Python中的内建函数
2021/08/07 Python