前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python epoll聊天室程序

python epoll聊天室程序

作者头像
py3study
发布2020-01-09 16:46:14
5720
发布2020-01-09 16:46:14
举报
文章被收录于专栏:python3python3

 仿照《how to use linux epoll with python》写的一个聊天室程序,比较简单。

python版本:2.7.3

代码语言:javascript
复制
#!/usr/bin/python  
# -*- coding:utf-8 -*- 
 
import socket, select 
 
for res in socket.getaddrinfo('0.0.0.0', 1025, socket.AF_INET, socket.SOCK_STREAM): 
    fa, socktype, proto, canonname, sa = res 
 
SockServer = socket.socket(fa, socktype, proto)  
SockServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
SockServer.bind(sa) 
SockServer.listen(5) 
 
epoll = select.epoll() 
epoll.register(SockServer.fileno(), select.EPOLLIN) 
 
try: 
    conns={}; addrs={} 
 
    while True: 
        for fileno, event in epoll.poll(1): 
            if fileno == SockServer.fileno(): 
                conn, addr = SockServer.accept() 
 
                epoll.register(conn.fileno(), select.EPOLLIN) 
                conns[conn.fileno()] = conn 
                addrs[conn.fileno()] = addr 
 
                conn.send("--- Welcome to server. Type EXIT to quit. ---\n") 
                print '[server]: accept connection from %s<%s>' % addr 
 
            elif event & select.EPOLLIN: 
                message = conns[fileno].recv(1024) 
                print "%s<%s> say: " % (addrs[fileno][0], addrs[fileno][1]) + message.strip() 
 
                if b'EXIT' in message: 
                    epoll.modify(fileno, select.EPOLLOUT) 
 
                for key in conns.keys(): 
                    if key != fileno: 
                        conns[key].send('%s<%s> say: %s' % (addrs[key][0], addrs[key][1], message)) 
 
            elif event & select.EPOLLOUT: 
                epoll.modify(fileno, 0) 
                conns[fileno].shutdown(socket.SHUT_RDWR) 
 
            elif event & select.EPOLLHUP: 
                epoll.unregister(fileno) 
                conns[fileno].close() 
                print '[server]: %s<%s> quit.' % addrs[fileno]  
 
                del conns[fileno] 
                del addrs[fileno] 
 
finally: 
    epoll.unregister(SockServer.fileno()) 
    epoll.close() 
    SockServer.close() 

程序运行如图:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档