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入门篇之字典
Oct 17 Python
Python MySQLdb模块连接操作mysql数据库实例
Apr 08 Python
Python使用QRCode模块生成二维码实例详解
Jun 14 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
tensorflow 变长序列存储实例
Jan 20 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
Python虚拟环境venv用法详解
May 25 Python
python实现学生成绩测评系统
Jun 22 Python
从python读取sql的实例方法
Jul 21 Python
搭建pypi私有仓库实现过程详解
Nov 25 Python
python 实现逻辑回归
Dec 30 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
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
ExtJs 3.1 XmlTreeLoader Example Error
2010/02/09 Javascript
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python操作串口的方法
2015/06/17 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
使用python实现画AR模型时序图
2019/11/20 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
餐饮业会计岗位职责
2013/12/19 职场文书
新品发布会主持词
2014/04/02 职场文书
员工保密承诺书
2014/05/28 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL
MySQL数据库完全卸载的方法
2022/03/03 MySQL