专栏首页python3python epoll聊天室程序

python epoll聊天室程序

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

python版本:2.7.3

#!/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() 

程序运行如图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python下使用epoll

    因为最近想学习如何用epoll写服务器, 于是找到了一篇介绍的文章. 因为我最近一直看不进技术文章, 于是打算通过翻译来强迫自己学习. 原文在这里:

    py3study
  • Python 字符串的方法

    count(sub[, start[, end]])      返回 sub 在字符串里边出现的次数,start 和 end 参数表示范围,可选。

    py3study
  • python 3.2 字符串方法学习总结

    Sequence Types sequence类型有六种:strings, byte sequences (bytes objects), byte arra...

    py3study
  • Python 字符串的方法

    count(sub[, start[, end]])      返回 sub 在字符串里边出现的次数,start 和 end 参数表示范围,可选。

    py3study
  • Expandpass:用于解密你有点记不清的密码的工具

    expandpass是一个简单的字符串扩展器,主要用于帮助你破解那些你有点记不清的密码。

    FB客服
  • 字符串方法汇总(三)

    以下为第三期字符串的方法,共10个 16、isspace() 判断字符串是够只包含空格字符,是返回True,否则返回False。 ? 17、istitle()...

    企鹅号小编
  • Spring Boot MyBatis配置多数据源

    十毛
  • 如何排查Java内存泄漏?看完我给跪了!

    没有经验的程序员经常认为Java的自动垃圾回收完全使他们免于担心内存管理。这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重...

    乱敲代码
  • 如何排查Java内存泄漏?看完我给跪了!

    没有经验的程序员经常认为Java的自动垃圾回收完全使他们免于担心内存管理。这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重破...

    JAVA葵花宝典
  • android recent key长按事件弹起触发最近列表故障分析

    问题描述 [Dialer]it will appear different behaviors after long press the menu to ex...

    用户1263308

扫码关注云+社区

领取腾讯云代金券