python使用epoll实现服务端的方法
如下所示:
#!/usr/bin/python
#-*-coding:UTF-8-*-
importsocket
importselect
send_data="helloworld!"
send_len=len(send_data)
recv_len=1024
tcp_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}
whileTrue:
events=epoll.poll(-1)
forfd,eventinevents:
fd_socket=fd_to_socket[fd]
iffd==tcp_socket.fileno():
whileTrue:
try:
new_socket,new_addr=fd_socket.accept()
exceptsocket.errorase:
(errno,err_msg)=e
printerrno
printerr_msg
iferrno==11:
break
print"newaccpet:",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
elifevent&select.EPOLLIN:
recv_datas=[]
recd=0
while(recd<recv_len):
try:
recv_data=fd_socket.recv(recv_len-recd)
'''处理读的正常关闭'''
ifrecv_data=="":
print"closesocket"
epoll.unregister(fd)
fd_to_socket[fd].close()
delfd_to_socket[fd]
break
else:
recv_datas.append(recv_data)
recd=recd+len(recv_data)
'''处理异常关闭(EAGAIN,EINTR)'''
exceptsocket.errorase:
(errno,err_msg)=e
printerrno
printerr_msg
'''因为用的水平触发,EAGAIN我们跳出循环,等待下次触发再读就好了'''
iferrno==11:
break
'''软中断打断了还要继续读'''
eliferrno==4:
continue
'''其它错误我们直接关闭套接字'''
else:
print"closesocket"
epoll.unregister(fd)
fd_to_socket[fd].close()
delfd_to_socket[fd]
break
printrepr(recv_datas)
total_send=0
whiletotal_send<send_len:
sent=fd_socket.send(send_data[total_send:])
ifsent==0:
print"closesocket"
epoll.unregister(fd)
fd_to_socket[fd].close()
delfd_to_socket[fd]
break
else:
printrepr(send_data[total_send:])
total_send=total_send+sent
其实这里的异常处理我们也可以用
exceptIOErrorase: printe.errno printe.strerror
以上这篇python使用epoll实现服务端的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。