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 Web框架Flask下网站开发入门实例
Feb 08 Python
使用Python的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
对Python中数组的几种使用方法总结
Jun 28 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
python机器学习之神经网络实现
Oct 13 Python
Python中*args和**kwargs的区别详解
Sep 17 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
Sep 29 Python
wxPython实现画图板
Aug 27 Python
python中os.remove()用法及注意事项
Jan 31 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中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
php与js的区别是什么
2013/08/05 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
Python中暂存上传图片的方法
2015/02/18 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
Python实现多线程的两种方式分析
2018/08/29 Python
python实现顺序表的简单代码
2018/09/28 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Python多图片合并PDF的方法
2019/01/03 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
python如何删除文件中重复的字段
2019/07/16 Python
python文件和文件夹复制函数
2020/02/07 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
专升本自我鉴定
2013/10/10 职场文书
实习介绍信模板
2015/01/30 职场文书
休学证明范本
2015/06/19 职场文书
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python
MySQL开启事务的方式
2021/06/26 MySQL