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中几个常用的类方法
Apr 08 Python
Python中优化NumPy包使用性能的教程
Apr 23 Python
如何在Python中编写并发程序
Feb 27 Python
从零开始学Python第八周:详解网络编程基础(socket)
Dec 14 Python
Python实现一个简单的验证码程序
Nov 03 Python
django 在原有表格添加或删除字段的实例
May 27 Python
python实现维吉尼亚算法
Mar 20 Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
django的模型类管理器——数据库操作的封装详解
Apr 01 Python
10行Python代码实现Web自动化管控的示例代码
Aug 14 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
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
Jquery选择器 $实现原理
2009/12/02 Javascript
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
PHP统计代码行数的小代码
2019/09/19 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
python实现坦克大战
2020/04/24 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
List, Set, Map是否继承自Collection接口?
2016/05/16 面试题
大学生四个方面的自我评价
2013/09/19 职场文书
大学生文员专业个人求职信范文
2014/01/05 职场文书
接待员岗位责任制
2014/02/10 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
党性心得体会
2014/09/03 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
秋菊打官司观后感
2015/06/03 职场文书
初一年级组工作总结
2015/08/12 职场文书
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python