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中的闭包详细介绍和实例
Nov 21 Python
在Python中操作列表之list.extend()方法的使用
May 20 Python
用Python实现KNN分类算法
Dec 22 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 Python
python 实现目录复制的三种小结
Dec 04 Python
Python属性和内建属性实例解析
Jan 14 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 Python
python写文件时覆盖原来的实例方法
Jul 22 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 zend解密软件绿色版测试可用
2008/04/14 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
Javascript复制实例详解
2016/01/28 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
python实现socket客户端和服务端简单示例
2014/02/24 Python
从零学Python之入门(四)运算
2014/05/27 Python
详解Python编程中time模块的使用
2015/11/20 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
CSS3的RGBA中关于整数和百分比值的转换
2015/08/04 HTML / CSS
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
internal修饰符起什么作用
2013/12/16 面试题
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书