import socket
import select
import multiprocessing
def main():
sSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
sSocket.bind(("",8989))
sSocket.listen(128)
epoll = select.epoll()
epoll.register(sSocket.fileno(),select.EPOLLIN|select.EPOLLET)
cSocketDict = {sSocket.fileno():sSocket}
cInfoDict = {}
while True:
events = epoll.poll()
#print("当前存在%d个事件"%(len(events)))
for fd,event in events:
rSocket = cSocketDict[fd]
if rSocket == sSocket:
cSocket,cInfo = sSocket.accept()
print("新的客户端连接[%s]"%(str(cInfo)))
cSocketDict[cSocket.fileno()] = cSocket
cInfoDict[cSocket.fileno()] = cInfo
epoll.register(cSocket.fileno(),select.EPOLLIN|select.EPOLLET)
#可读事件
elif event & select.EPOLLIN:
try:
recvData = rSocket.recv(1024)
except ConnectionResetError:
print("客户端[%s]强制关闭了一个现有的连接"%(str(cInfoDict[fd])))
epoll.modify(fd,select.EPOLLHUP)
else:
if recvData:
print("客户端[%s],收到数据:[%s]"%((rSocket.getpeername()),recvData.decode("utf-8")))
epoll.modify(fd,select.EPOLLOUT)
else:
print("客户端[%s]退出"%(str(cInfoDict[fd])))
epoll.unregister(fd)
rSocket.close()
del cSocketDict[fd]
#可写事件
elif event & select.EPOLLOUT:
rSocket.send("我收到数据了".encode("utf-8"))
epoll.modify(fd,select.EPOLLIN)
#关闭事件
elif event & select.EPOLLHUP:
print("客户端[%s]退出"%(str(cInfoDict[fd])))
epoll.unregister(fd)
rSocket.close()
del cSocketDict[fd]
epoll.unregister(cSocketDict.fileno())
sSocket.close()
epoll.close()
if __name__ == "__main__":
main()