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 相关文章推荐
Python3.0与2.X版本的区别实例分析
Aug 25 Python
跟老齐学Python之做一个小游戏
Sep 28 Python
Python中的pack和unpack的使用
Mar 12 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
Python中property函数用法实例分析
Jun 04 Python
Python基于最小二乘法实现曲线拟合示例
Jun 14 Python
对Python的多进程锁的使用方法详解
Feb 18 Python
python随机数分布random均匀分布实例
Nov 27 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
python随机模块random的22种函数(小结)
May 15 Python
MxNet预训练模型到Pytorch模型的转换方式
May 25 Python
Python自带的IDE在哪里
Jul 01 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
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
2018/12/21 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
js静态方法与实例方法分析
2011/07/04 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
python实现迭代法求方程组的根过程解析
2019/11/25 Javascript
Python 专题一 函数的基础知识
2017/03/16 Python
Python 迭代器与生成器实例详解
2017/05/18 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
Python交互环境下实现输入代码
2018/06/22 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
python实现两张图片的像素融合
2019/02/23 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
Python调用C语言程序方法解析
2020/07/07 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
接口的多继承会带来哪些问题
2015/08/17 面试题
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
分层教学实施方案
2014/03/19 职场文书
党员个人自我剖析材料
2014/10/08 职场文书
党员活动总结
2015/02/04 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书