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】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
