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简单日志处理类分享
Feb 14 Python
python通过函数属性实现全局变量的方法
May 16 Python
python中管道用法入门实例
Jun 04 Python
Python实现高效求解素数代码实例
Jun 30 Python
Python中函数参数设置及使用的学习笔记
May 03 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
Oct 01 Python
python opencv读mp4视频的实例
Dec 07 Python
详解python持久化文件读写
Apr 06 Python
pytorch之ImageFolder使用详解
Jan 06 Python
Python猜数字算法题详解
Mar 01 Python
python 实现两个线程交替执行
May 02 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
javascript 常用功能总结
2012/03/18 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
bootstrap table小案例
2016/10/21 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
解决easyui日期时间框ie的兼容的问题
2018/03/01 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
python中字典dict常用操作方法实例总结
2015/04/04 Python
EM算法的python实现的方法步骤
2018/01/02 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
幼儿园五一活动方案
2014/02/07 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
六五普法规划实施方案
2014/03/21 职场文书
酒店节能降耗方案
2014/05/08 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
五年级小学生评语
2014/12/26 职场文书
教师个人成长总结
2015/02/11 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
详解Python常用的魔法方法
2021/06/03 Python
vue3中provide && inject的使用
2021/07/01 Vue.js
使用springMVC所需要的pom配置
2021/09/15 Java/Android
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android