经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
python使用epoll实现服务端的方法
来源:jb51  时间:2018/10/17 8:46:31  对本文有异议

如下所示:

  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. import socket
  4. import select
  5.  
  6. send_data = "hello world!"
  7. send_len = len(send_data)
  8. recv_len = 1024
  9. tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10. tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  11. addr = ("0.0.0.0", 8765)
  12. tcp_socket.bind(addr)
  13. tcp_socket.listen(5)
  14. tcp_socket.setblocking(False)
  15. epoll = select.epoll()
  16. '''(边缘触发)select.EPOLLIN | select.EPOLLET'''
  17. epoll.register(tcp_socket.fileno(), select.EPOLLIN)
  18. '''因为epoll返回的触发事件对应的是套接字文件描述符,所以需要在字典中加入对应关系'''
  19. fd_to_socket = {tcp_socket.fileno():tcp_socket}
  20.  
  21. while True :
  22. events = epoll.poll(-1)
  23. for fd, event in events:
  24. fd_socket = fd_to_socket[fd]
  25. if fd == tcp_socket.fileno():
  26. while True:
  27. try:
  28. new_socket, new_addr = fd_socket.accept()
  29. except socket.error as e:
  30. (errno, err_msg) = e
  31. print errno
  32. print err_msg
  33. if errno == 11:
  34. break
  35. print "new accpet:", new_addr
  36. new_socket.setblocking(False)
  37. new_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
  38. epoll.register(new_socket.fileno(), select.EPOLLIN)
  39. fd_to_socket[new_socket.fileno()] = new_socket
  40. elif event&select.EPOLLIN:
  41. recv_datas = []
  42. recd = 0
  43. while (recd < recv_len):
  44. try:
  45. recv_data = fd_socket.recv(recv_len - recd)
  46. '''处理读的正常关闭'''
  47. if recv_data == "":
  48. print "close socket"
  49. epoll.unregister(fd)
  50. fd_to_socket[fd].close()
  51. del fd_to_socket[fd]
  52. break
  53. else:
  54. recv_datas.append(recv_data)
  55. recd = recd + len(recv_data)
  56. '''处理异常关闭(EAGAIN,EINTR)'''
  57. except socket.error as e:
  58. (errno, err_msg) = e
  59. print errno
  60. print err_msg
  61. '''因为用的水平触发,EAGAIN我们跳出循环,等待下次触发再读就好了'''
  62. if errno == 11:
  63. break
  64. '''软中断打断了还要继续读'''
  65. elif errno == 4:
  66. continue
  67. '''其它错误我们直接关闭套接字'''
  68. else:
  69. print "close socket"
  70. epoll.unregister(fd)
  71. fd_to_socket[fd].close()
  72. del fd_to_socket[fd]
  73. break
  74. print repr(recv_datas)
  75. total_send = 0
  76. while total_send < send_len:
  77. sent = fd_socket.send(send_data[total_send:])
  78. if sent == 0:
  79. print "close socket"
  80. epoll.unregister(fd)
  81. fd_to_socket[fd].close()
  82. del fd_to_socket[fd]
  83. break
  84. else:
  85. print repr(send_data[total_send:])
  86. total_send = total_send + sent

其实这里的异常处理我们也可以用

  1. except IOError as e:
  2. print e.errno
  3. print e.strerror

以上这篇python使用epoll实现服务端的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号