加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python socket 聊天室

发布时间:2020-12-17 17:14:56 所属栏目:Python 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 __author__ = '’import socketimport selectHOST = ""PORT = 9008BACKLOG = 100BUFF = 1024ADDR = (HOST,PORT)CONNECT_MAP = {}def broadcast_msg(_s

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

__author__ = '’

import socket
import select

HOST = ""
PORT = 9008
BACKLOG = 100
BUFF = 1024
ADDR = (HOST,PORT)

CONNECT_MAP = {}


def broadcast_msg(_srv_sock,my_sock,msg):
    for _file_no,_sock in CONNECT_MAP.iteritems():
        if _sock != _srv_sock and _sock != my_sock:
            try:
                _sock.send(msg)
            except socket.error:
                pass


def chat_server():
    srv_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    srv_sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    srv_sock.bind(ADDR)
    srv_sock.listen(BACKLOG)

    _epoll = select.epoll()
    _epoll.register(srv_sock.fileno(),select.EPOLLIN)

    print "Start chat server on port %d" % PORT

    while True:
        events = _epoll.poll(timeout=0.5)
        for _file_no,event in events:
            if _file_no == srv_sock.fileno():
                _cli_sock,_addr = srv_sock.accept()
                _cli_sock.setblocking(0)
                print "Client (%s,%s) connected" % _addr
                broadcast_msg(srv_sock,_cli_sock,"[%s:%s] entered rootnr" % _addr)
                _epoll.register(_cli_sock.fileno(),select.EPOLLIN)
                CONNECT_MAP[_cli_sock.fileno()] = _cli_sock
            elif event & select.EPOLLIN:
                try:
                    _sock = CONNECT_MAP[_file_no]
                    _data = _sock.recv(BUFF)
                    if _data:
                        _msg = "<" + str(_sock.getpeername()) + ">" + _data + 'nr'
                        broadcast_msg(srv_sock,_sock,_msg)
                except:
                    CONNECT_MAP[_file_no].close()
                    CONNECT_MAP.pop(_file_no)
                    _epoll.unregister(_file_no)
            elif event & select.EPOLLHUP:
                CONNECT_MAP[_file_no].close()
                CONNECT_MAP.pop(_file_no)
                _epoll.unregister(_file_no)


if __name__ == "__main__":
    chat_server()

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读