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

首頁 > 編程 > Python > 正文

python使用epoll實現(xiàn)服務(wù)端的方法

2020-01-04 14:20:38
字體:
供稿:網(wǎng)友

如下所示:

#!/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()'''(邊緣觸發(fā))select.EPOLLIN | select.EPOLLET'''epoll.register(tcp_socket.fileno(), select.EPOLLIN)'''因為epoll返回的觸發(fā)事件對應(yīng)的是套接字文件描述符,所以需要在字典中加入對應(yīng)關(guān)系'''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)     '''處理讀的正常關(guān)閉'''     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)    '''處理異常關(guān)閉(EAGAIN,EINTR)'''    except socket.error as e:     (errno, err_msg) = e     print errno     print err_msg     '''因為用的水平觸發(fā),EAGAIN我們跳出循環(huán),等待下次觸發(fā)再讀就好了'''     if errno == 11:      break     '''軟中斷打斷了還要繼續(xù)讀'''     elif errno == 4:      continue     '''其它錯誤我們直接關(guān)閉套接字'''     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實現(xiàn)服務(wù)端的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 陇南市| 民权县| 白城市| 大姚县| 平邑县| 教育| 青冈县| 晴隆县| 阿坝| 赤峰市| 左云县| 宜城市| 万源市| 承德市| 辽阳市| 滦平县| 阳东县| 山西省| 喜德县| 蚌埠市| 高陵县| 阳朔县| 夹江县| 福鼎市| 长岭县| 新巴尔虎右旗| 南郑县| 剑阁县| 涞水县| 阿克陶县| 绥中县| 嘉义市| 崇信县| 壤塘县| 天台县| 湖州市| 永州市| 荥经县| 吉木乃县| 精河县| 同德县|