利用pytho标准库的socket模块,可以快速建立TCP连接,可以利用TCP连接实现简单的聊天室 编译环境是在linux中,win应该也可以 重要的地方都有注释,主要为两个类,
原理
代码
Server类主要用来存储当前连接到服务器上的用户名和连接到服务器上的socket对象(用于服务器主动发送消息回去)
ChatRoom_s用来绑定address来监听客户端的连接,然后开启多线程接受数据,并且把收到的一个客户信息,发送给其他所有的连接上来的用户from socket import * import threading import atexit class Server(object): def __init__(self): self.addr_user_map = {} #addr对应的用户名 self.addr_sock_map = {} #addr对应的客户端通信socket def add_user(self,addr,username): self.addr_user_map[addr] = username def del_user(self,addr): del self.addr_user_map[addr] def get_user(self,addr): return self.addr_user_map.get(addr,'None') def check_user(self,username): return username in self.addr_user_map.values() def add_client(self,addr,s): self.addr_sock_map[addr] = s def del_client(self,addr): del self.addr_sock_map[addr] def iter_client(self,addr): ''' 用来获得,除了参数addr外的所有的客户端socket,用以发送消息给所有聊天室的人 ''' for a in self.addr_sock_map: if a == addr: continue else: yield self.addr_sock_map[a] class ChatRoom_s(object): ''' 聊天室类 ''' def __init__(self): ''' 变量的初始化 ''' self.bind_addr = ('127.0.0.1',8899) self.server = Server() self.s = None def start(self): ''' 开始服务器socket的监听和创建子线程来处理客户端请求 ''' self.s = socket() self.s.bind(self.bind_addr) self.s.listen(10) print('服务器开启监听--->') while True: c_s,addr = self.s.accept() self.server.add_client(addr,c_s) t = threading.Thread(target=self.handle_client,args=(c_s,addr)) t.start() def handle_client(self,s,addr): ''' 一直循环等待,客户的发送消息 ''' while True: a = s.recv(1024) a = a.decode('utf-8') if '[name]' in a: name = a.split()[1] self.server.add_user(addr,name) print('当前的用户',self.server.addr_user_map) continue #改用户名的消息,不用广播 #如果用户退出聊天器就把服务器里关于addr的记录删了,然后退出这个函数(线程) if '[stop]' in a: print(f'[info]: {self.server.get_user(addr)}-->logout') self.server.del_user(addr) self.server.del_client(addr) return 0 print(f'接收到来自:{addr}{self.server.get_user(addr)}的消息:{a}') b = f"[{self.server.get_user(addr)}]" c = b + a + 'n' self.send_all(addr,c) def send_all(self,addr,message): ''' 给除了发送过来的每一个人发送消息 ''' for s in self.server.iter_client(addr): s.send(message.encode('utf-8')) def clean(self): ''' 当程序结束时候,用来关闭socket(发送一个,[stop] 消息) ''' print('程序退出了...') self.s.close() if __name__ == "__main__": a = ChatRoom_s() a.start() atexit.register(a.clean)
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算