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 模拟登陆的两种实现方法
Aug 10 Python
python实现多线程网页下载器
Apr 15 Python
opencv python 图像去噪的实现方法
Aug 31 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
Feb 27 Python
python定时按日期备份MySQL数据并压缩
Apr 19 Python
Python 的AES加密与解密实现
Jul 09 Python
Python 使用threading+Queue实现线程池示例
Dec 21 Python
Pycharm小白级简单使用教程
Jan 08 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
Apr 23 Python
PyCharm2019 安装和配置教程详解附激活码
Jul 31 Python
java字符串格式化输出实例讲解
Jan 06 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 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访问查询mysql数据的三种方法
2006/10/09 PHP
php强制下载类型的实现代码
2011/04/21 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
用jscript启动sqlserver
2007/06/21 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
Python探索之自定义实现线程池
2017/10/27 Python
Python进阶之尾递归的用法实例
2018/01/31 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
python解释器安装教程的方法步骤
2020/07/02 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
一份全面的PHP面试问题考卷
2012/07/15 面试题
一个SQL面试题
2014/08/21 面试题
违反校纪校规检讨书
2014/02/15 职场文书
工作建议书范文
2014/05/13 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
离婚协议书格式范本
2016/03/18 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书