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调用windows api锁定计算机示例
Apr 17 Python
跟老齐学Python之Import 模块
Oct 13 Python
在Python中利用Pandas库处理大数据的简单介绍
Apr 07 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
python实现布隆过滤器及原理解析
Dec 08 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 Python
Python request post上传文件常见要点
Nov 20 Python
python 实现Requests发送带cookies的请求
Feb 08 Python
python绘制高斯曲线
Feb 19 Python
python如何为list实现find方法
May 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
php 魔术函数使用说明
2010/02/21 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
PHP中16个高危函数整理
2019/09/19 PHP
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python实现调度算法代码详解
2017/12/01 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
商场中秋节活动方案
2014/02/07 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
爱的教育读书笔记
2015/06/26 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书
vue组件vue-esign实现电子签名
2022/04/21 Vue.js
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript