python socket epoll_python epoll方式tcp连接回发消息

#-*- coding:utf-8 -*-

importsocketimportselectclasstestserver():def __init__(self):

self.serversocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

self.serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)

self.serversocket.bind(('0.0.0.0', 8889))

self.serversocket.listen(128)

self.serversocket.setblocking(0)defrun(self):

response= "connecting status: 200"epoll=select.epoll()

epoll.register(self.serversocket.fileno(), select.EPOLLIN)try:

connections={}

requests={}

responses={}

endflag= '\n\r\n'

whileTrue:

events= epoll.poll(1)for fid, event inevents:if fid ==self.serversocket.fileno():

connection, address=self.serversocket.accept()

connection.setblocking(0)

epoll.register(connection.fileno(), select.EPOLLIN)

connections[connection.fileno()]=connection

requests[connection.fileno()]= ''responses[connection.fileno()]=response.encode()elif event &select.EPOLLIN:try:

requests[fid]= connections[fid].recv(1024)if len(str(requests[fid].decode())) ==0:

connections[fid].shutdown(socket.SHUT_RDWR)break

else:print("2 | ------ :" + str(requests[fid].decode()) + "\n")

byteswritten=connections[fid].send(responses[fid])if endflag inrequests[fid]:

epoll.modify(fid, select.EPOLLOUT)

connections[fid].setsockopt(socket.IPPROTO_TCP, socket.TCP_CORK,1)print('-' * 40 + '\n' + requests[fid].decode()[:-2])except:continue

elif event &select.EPOLLOUT:

byteswritten=connections[fid].send(responses[fid])

responses[fid]=responses[fid][byteswritten:]if len(responses[fid]) ==0:

connections[fid].setsockopt(socket.IPPROTO_TCP, socket.TCP_CORK, 0)

epoll.modify(fid, 0)

connections[fid].shutdown(socket.SHUT_RDWR)elif event &select.EPOLLHUP:

epoll.unregister(fid)

connections[fid].close()delconnections[fid]except:print("server excepted ...")

epoll.unregister(self.serversocket.fileno())

self.run()finally:print("server closed ...")if __name__ == "__main__":

serv=testserver()

serv.run()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值