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编程中装饰器的使用示例解析
Jun 20 Python
Python设计模式之工厂模式简单示例
Jan 09 Python
python版微信跳一跳游戏辅助
Jan 11 Python
python调用java的jar包方法
Dec 15 Python
python url 参数修改方法
Dec 26 Python
Pandas读取并修改excel的示例代码
Feb 17 Python
Pytorch释放显存占用方式
Jan 13 Python
Python装饰器用法与知识点小结
Mar 09 Python
python实现控制台输出彩色字体
Apr 05 Python
基于pycharm实现批量修改变量名
Jun 02 Python
Python使用openpyxl批量处理数据
Jun 23 Python
Python 图片添加美颜效果
Apr 28 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学习笔记 数组遍历实现代码
2011/06/09 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
javascript实现的listview效果
2007/04/28 Javascript
奇妙的js
2007/09/24 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
python中的数据结构比较
2019/05/13 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
酒店中秋节促销方案
2014/01/30 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
文秘求职信范文
2014/04/10 职场文书
节能环保演讲稿
2014/08/28 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
见习期个人总结
2015/03/05 职场文书
民间借贷借条如何写
2015/05/26 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技