Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14545
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-16 20:05
文章分类
文章存档

2014年(4)

我的朋友

分类: Python/Ruby

2014-10-19 17:49:42

源码如下:

点击(此处)折叠或打开

  1. import socket, select

  2. EOL1 = b'\n\n'
  3. EOL2 = b'\n\r\n'
  4. response = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n'
  5. response += b'Content-Type: text/plain\r\nContent-Length: 13\r\n\r\n'
  6. response += b'Hello, world!'

  7. serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  9. serversocket.bind(('0.0.0.0', 8080))
  10. serversocket.listen(1)
  11. serversocket.setblocking(0)

  12. epoll = select.epoll()
  13. epoll.register(serversocket.fileno(), select.EPOLLIN)

  14. try:
  15.    connections = {}; requests = {}; responses = {}
  16.    while True:
  17.       events = epoll.poll(1)
  18.       for fileno, event in events:
  19.          if fileno == serversocket.fileno():
  20.             connection, address = serversocket.accept()
  21.             connection.setblocking(0)
  22.             epoll.register(connection.fileno(), select.EPOLLIN)
  23.             connections[connection.fileno()] = connection
  24.             requests[connection.fileno()] = b''
  25.             responses[connection.fileno()] = response
  26.          elif event & select.EPOLLIN:
  27.             requests[fileno] += connections[fileno].recv(1024)
  28.             if EOL1 in requests[fileno] or EOL2 in requests[fileno]:
  29.                epoll.modify(fileno, select.EPOLLOUT)
  30.                print('-'*40 + '\n' + requests[fileno].decode()[:-2])
  31.          elif event & select.EPOLLOUT:
  32.             byteswritten = connections[fileno].send(responses[fileno])
  33.             responses[fileno] = responses[fileno][byteswritten:]
  34.             if len(responses[fileno]) == 0:
  35.                epoll.modify(fileno, 0)
  36.                connections[fileno].shutdown(socket.SHUT_RDWR)
  37.          elif event & select.EPOLLHUP:
  38.             epoll.unregister(fileno)
  39.             connections[fileno].close()
  40.             del connections[fileno]
  41. finally:
  42.    epoll.unregister(serversocket.fileno())
  43.    epoll.close()
  44.    serversocket.close()

关键函数:
    select.epoll()
    epoll.register(fd, event)
    epoll.modify(fd, event)
    epoll.unregister(fd)
    epoll.close()
    epoll.poll()
关键事件:
    select.EPOLLIN
    select.EPOLLOUT
    select.EPOLLHU



阅读(1325) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Tornado中ioloop.py之PeriodicCallback类分析

给主人留下些什么吧!~~