国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python使用epoll實現服務端的方法

2020-02-15 23:15:11
字體:
來源:轉載
供稿:網友

如下所示:

#!/usr/bin/python# -*- coding: UTF-8 -*-import socketimport selectsend_data = "hello world!"send_len = len(send_data)recv_len = 1024tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)addr = ("0.0.0.0", 8765)tcp_socket.bind(addr)tcp_socket.listen(5)tcp_socket.setblocking(False)epoll = select.epoll()'''(邊緣觸發)select.EPOLLIN | select.EPOLLET'''epoll.register(tcp_socket.fileno(), select.EPOLLIN)'''因為epoll返回的觸發事件對應的是套接字文件描述符,所以需要在字典中加入對應關系'''fd_to_socket = {tcp_socket.fileno():tcp_socket}while True : events = epoll.poll(-1) for fd, event in events:  fd_socket = fd_to_socket[fd]  if fd == tcp_socket.fileno():   while True:    try:     new_socket, new_addr = fd_socket.accept()    except socket.error as e:     (errno, err_msg) = e     print errno     print err_msg     if errno == 11:      break    print "new accpet:", new_addr    new_socket.setblocking(False)    new_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)    epoll.register(new_socket.fileno(), select.EPOLLIN)    fd_to_socket[new_socket.fileno()] = new_socket  elif event&select.EPOLLIN:   recv_datas = []   recd = 0   while (recd < recv_len):    try:     recv_data = fd_socket.recv(recv_len - recd)     '''處理讀的正常關閉'''     if recv_data == "":      print "close socket"      epoll.unregister(fd)      fd_to_socket[fd].close()      del fd_to_socket[fd]      break     else:      recv_datas.append(recv_data)      recd = recd + len(recv_data)    '''處理異常關閉(EAGAIN,EINTR)'''    except socket.error as e:     (errno, err_msg) = e     print errno     print err_msg     '''因為用的水平觸發,EAGAIN我們跳出循環,等待下次觸發再讀就好了'''     if errno == 11:      break     '''軟中斷打斷了還要繼續讀'''     elif errno == 4:      continue     '''其它錯誤我們直接關閉套接字'''     else:      print "close socket"      epoll.unregister(fd)      fd_to_socket[fd].close()      del fd_to_socket[fd]      break    print repr(recv_datas)    total_send = 0    while total_send < send_len:     sent = fd_socket.send(send_data[total_send:])     if sent == 0:      print "close socket"      epoll.unregister(fd)      fd_to_socket[fd].close()      del fd_to_socket[fd]      break     else:      print repr(send_data[total_send:])      total_send = total_send + sent

其實這里的異常處理我們也可以用

except IOError as e:  print e.errno  print e.strerror

以上這篇python使用epoll實現服務端的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林站長站。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彭山县| 乌鲁木齐县| 正蓝旗| 望都县| 林芝县| 聂荣县| 仪陇县| 馆陶县| 滨州市| 大宁县| 肇源县| 巢湖市| 阳春市| 敦煌市| 科尔| 甘泉县| 贡山| 景谷| 全州县| 兴和县| 西安市| 开化县| 海晏县| 二手房| 宾阳县| 榆社县| 沂南县| 平凉市| 张北县| 井陉县| 南康市| 德江县| 富裕县| 营口市| 巴青县| 故城县| 郓城县| 西峡县| 临洮县| 新龙县| 沙洋县|