【仿地图源码】【千兰花源码】【共享源码网】python 聊天室 源码_python开源聊天程序

时间:2024-11-28 19:40:54 来源:赢顺源码开发 分类:休闲

1.python什么是聊天弱引用,__weakref__如何使用?
2.Python要哪些要点要学习
3.如何用Python编写一个聊天室

python 聊天室 源码_python开源聊天程序

python什么是弱引用,__weakref__如何使用?

       大家好,我是室源程序员老王。让我们来谈谈Python中的源聊弱引用。

       假设我们需要创建一个匿名聊天室。天程为了实现这一目标,聊天我们首先定义了一个代表用户的室源仿地图源码类User。由于匿名聊天,源聊用户无需注册,天程为每个用户分配一个唯一的聊天id。我们确保id的室源独特性,通过维护一个全局字典,源聊存储当前所有id与用户之间的天程关系,一旦发生冲突,聊天重新生成id并更新全局字典。室源

       随后,源聊我们定义了聊天室函数chat_room,该函数允许多人参与聊天。在聊天结束后,这些匿名用户将失去作用。然而,问题在于,千兰花源码当用户被创建时,全局字典id_user中将记录所有User实例的引用。即使chat_room返回,id_user仍保有所有User的引用,导致这些实例无法被垃圾回收,进而影响id的重用。

       解决这个问题的一种方法是,在chat_room返回前从id_user中删除用户引用。但考虑到实际聊天室功能的复杂性以及可能的异常处理,选择正确的共享源码网del id_user的位置需要谨慎。此外,这种操作在逻辑上并不连贯,易于引入错误。

       引入弱引用提供了一种替代解决方案。Python的weakref库中的WeakValueDictionary可以作为替代id_user的普通字典。这个WeakValueDictionary实现了字典接口,但其特殊之处在于,它的值为弱引用。

       强引用,如chat_room中的搜索框架源码u1和u2,只要对象还存在强引用,它们将不会被垃圾回收。因此,u1和u2指向的User实例在chat_room中不会被回收。然而,弱引用不同,如id_user中的值。虽然它们同样指向User实例,但只要实例没有其他强引用,这些User将被回收,拍卖竞价源码并且id_user中对应的条目也会被删除。因此,当chat_room返回时,u1和u2指向的User已无强引用,id_user会自动执行删除操作,无需显式调用del。

       输出结果显示,尽管我们没有删除id_user中的元素,id_user仍然为空,符合预期。如果全局变量中已有一个User,再次运行程序,id_user将保留一个User,因为全局变量u一直引用着这个User。

       除了WeakValueDictionary,还有WeakKeyDictionary和WeakSet。WeakKeyDictionary中Key为弱引用,而WeakSet相当于只有Key没有Value的WeakKeyDictionary。更多细节在这里就不赘述。

       ref类允许我们创建一个简单的弱引用。例如,我们可以对全局的User u创建一个ref类的实例。当我们调用u_ref()时,ref类会返回u对应的强引用。如果在调用u_ref()之前,User的强引用已经消失,再次调用u_ref()将返回None。

       最后要指出,并非所有对象都支持弱引用。例如,数字和字符串不支持弱引用。考虑到这些类型在计算中可能重复出现,将其弱引用可能不符合逻辑。相比之下,类的实例、容器等对象更适合使用弱引用。完整的可弱引用的对象列表在文档中提供,但在实际使用中,无需特意查阅。

Python要哪些要点要学习

       é˜¶æ®µä¸€ï¼šPython开发基础

       Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法、数据类型、字符编码、文件操作、函数、装饰器、迭代器、内置方法、常用模块等。

       é˜¶æ®µäºŒï¼šPython高级编程和数据库开发

       Python全栈开发与人工智能之Python高级编程和数据库开发知识学习内容包括:面向对象开发、Socket网络编程、线程、进程、队列、IO多路模型、Mysql数据库开发等。

       é˜¶æ®µä¸‰ï¼šå‰ç«¯å¼€å‘

       Python全栈开发与人工智能之前端开发知识学习内容包括:Html、CSS、JavaScript开发、Jquery&bootstrap开发、前端框架VUE开发等。

       é˜¶æ®µå››ï¼šWEB框架开发

       Python全栈开发与人工智能之WEB框架开发学习内容包括:Django框架基础、Django框架进阶、BBS+Blog实战项目开发、缓存和队列中间件、Flask框架学习、Tornado框架学习、Restful API等。

       é˜¶æ®µäº”:爬虫开发

       Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。

       é˜¶æ®µå…­ï¼šå…¨æ ˆé¡¹ç›®å®žæˆ˜

       Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具学习、CRM客户关系管理系统开发、路飞学城在线教育平台开发等。

       é˜¶æ®µä¸ƒï¼šç®—法&设计模式

       é˜¶æ®µå…«ï¼šæ•°æ®åˆ†æž

       Python全栈开发与人工智能之数据分析学习内容包括:金融量化分析。

       é˜¶æ®µä¹ï¼šæœºå™¨å­¦ä¹ ã€å›¾åƒè¯†åˆ«ã€NLP自然语言处理

       Python全栈开发与人工智能之人工智能学习内容包括:机器学习、图形识别、人工智能玩具开发等。

       é˜¶æ®µåï¼šLinux系统&百万级并发架构解决方案

       é˜¶æ®µåä¸€ï¼šé«˜å¹¶å‘语言GO开发

       Python全栈开发与人工智能之高并发语言GO开发学习内容包括:GO语言基础、数据类型与文件IO操作、函数和面向对象、并发编程等。

如何用Python编写一个聊天室

       ä¸€ã€è¯¾ç¨‹ä»‹ç»

       1.简介

       æœ¬æ¬¡é¡¹ç›®è¯¾æ˜¯å®žçŽ°ç®€å•èŠå¤©å®¤ç¨‹åºçš„服务器端和客户端。

       2.知识点

       æœåŠ¡å™¨ç«¯æ¶‰åŠåˆ°asyncore、asynchat和socket这几个模块,客户端用到了telnetlib、wx、time和thread这几个模块。

       3.所需环境

       æœ¬æ¬¡è¯¾ä¸­ç¼–写客户端需要用到wxPython,它是一个GUI工具包,请先使用下面的命令安装:

       $ sudo apt-get install python-wxtools

       å¯†ç ä¸ºshiyanlou

       4.项目效果截图

       ç™»å½•çª—口

       èŠå¤©çª—口

       äºŒã€é¡¹ç›®å®žæˆ˜ï¼ˆæœåŠ¡å™¨ç«¯ï¼‰

       1.服务器类

       é¦–先需要一个聊天服务器,这里继承asyncore的dispatcher类来实现,代码如下

       class ChatServer(dispatcher):

       """

       èŠå¤©æœåŠ¡å™¨

       """

       def __init__(self, port):

       dispatcher.__init__(self)

       self.create_socket(socket.AF_INET, socket.SOCK_STREAM)

       self.set_reuse_addr()

       self.bind(('', port))

       self.listen(5)

       self.users = { }

       self.main_room = ChatRoom(self)

       def handle_accept(self):

       conn, addr = self.accept()

       ChatSession(self, conn)

       2.会话类

       æœ‰äº†æœåŠ¡å™¨ç±»è¿˜éœ€è¦èƒ½ç»´æŠ¤æ¯ä¸ªç”¨æˆ·çš„连接会话,这里继承asynchat的async_chat类来实现,代码如下:

       class ChatSession(async_chat):

       """

       è´Ÿè´£å’Œå•ç”¨æˆ·é€šä¿¡

       """

       def __init__(self, server, sock):

       async_chat.__init__(self, sock)

       self.server = server

       self.set_terminator('\n')

       self.data = []

       self.name = None

       self.enter(LoginRoom(server))

       def enter(self, room):

       '从当前房间移除自身,然后添加到指定房间'

       try:

       cur = self.room

       except AttributeError:

       pass

       else:

       cur.remove(self)

       self.room = room

       room.add(self)

       def collect_incoming_data(self, data):

       '接受客户端的数据'

       self.data.append(data)

       def found_terminator(self):

       '当客户端的一条数据结束时的处理'

       line = ''.join(self.data)

       self.data = []

       try:

       self.room.handle(self, line)

       except EndSession:

       self.handle_close()

       def handle_close(self):

       async_chat.handle_close(self)

       self.enter(LogoutRoom(self.server))

       3.命令解释器

       çŽ°åœ¨å°±éœ€è¦ä¸€ä¸ªå‘½ä»¤è§£é‡Šå™¨èƒ½å¤Ÿè§£é‡Šç”¨æˆ·çš„命令,例如登录、查询在线用户和发消息等,代码如下:

       class CommandHandler:

       """

       å‘½ä»¤å¤„理类

       """

       def unknown(self, session, cmd):

       '响应未知命令'

       session.push('Unknown command: %s\n' % cmd)

       def handle(self, session, line):

       '命令处理'

       if not line.strip():

       return

       parts = line.split(' ', 1)

       cmd = parts[0]

       try:

       line = parts[1].strip()

       except IndexError:

       line = ''

       meth = getattr(self, 'do_' + cmd, None)

       try:

       meth(session, line)

       except TypeError:

       self.unknown(session, cmd)

       4.房间

       æŽ¥ä¸‹æ¥å°±éœ€è¦å®žçŽ°èŠå¤©å®¤çš„房间了,这里我们定义了三种房间,分别是用户刚登录时的房间、聊天的房间和退出登录的房间,这三种房间都有一个公共的父类,代码如下:

       class Room(CommandHandler):

       """

       åŒ…含多个用户的环境,负责基本的命令处理和广播

       """

       def __init__(self, server):

       self.server = server

       self.sessions = []

       def add(self, session):

       '一个用户进入房间'

       self.sessions.append(session)

       def remove(self, session):

       '一个用户离开房间'

       self.sessions.remove(session)

       def broadcast(self, line):

       '向所有的用户发送指定消息'

       for session in self.sessions:

       session.push(line)

       def do_logout(self, session, line):

       '退出房间'

       raise EndSession

       class LoginRoom(Room):

       """

       åˆšç™»å½•çš„用户的房间

       """

       def add(self, session):

       '用户连接成功的回应'

       Room.add(self, session)

       session.push('Connect Success')

       def do_login(self, session, line):

       '登录命令处理'

       name = line.strip()

       if not name:

       session.push('UserName Empty')

       elif name in self.server.users:

       session.push('UserName Exist')

       else:

       session.name = name

       session.enter(self.server.main_room)

       class ChatRoom(Room):

       """

       èŠå¤©ç”¨çš„房间

       """

       def add(self, session):

       '广播新用户进入'

       session.push('Login Success')

       self.broadcast(session.name + ' has entered the room.\n')

       self.server.users[session.name] = session

       Room.add(self, session)

       def remove(self, session):

       '广播用户离开'

       Room.remove(self, session)

       self.broadcast(session.name + ' has left the room.\n')

       def do_say(self, session, line):

       '客户端发送消息'

       self.broadcast(session.name + ': ' + line + '\n')

       def do_look(self, session, line):

       '查看在线用户'

       session.push('Online Users:\n')

       for other in self.sessions:

       session.push(other.name + '\n')

       class LogoutRoom(Room):

       """

       ç”¨æˆ·é€€å‡ºæ—¶çš„房间

       """

       def add(self, session):

       '从服务器中移除'

       try:

       del self.server.users[session.name]

       except KeyError:

       pass

       5.服务器端完整代码

       #!/usr/bin/python

       # encoding: utf-8

       from asyncore import dispatcher

       from asynchat import async_chat

       import socket, asyncore

       PORT = #端口

       class EndSession(Exception):

       """

       è‡ªå®šä¹‰ä¼šè¯ç»“束时的异常

       """

       pass

       class CommandHandler:

       """

       å‘½ä»¤å¤„理类

       """

       def unknown(self, session, cmd):

       '响应未知命令'

       session.push('Unknown command: %s\n' % cmd)

       def handle(self, session, line):

       '命令处理'

       if not line.strip():

       return

       parts = line.split(' ', 1)

       cmd = parts[0]

       try:

       line = parts[1].strip()

       except IndexError:

       line = ''

       meth = getattr(self, 'do_' + cmd, None)

       try:

       meth(session, line)

       except TypeError:

       self.unknown(session, cmd)

       class Room(CommandHandler):

       """

       åŒ…含多个用户的环境,负责基本的命令处理和广播

       """

       def __init__(self, server):

       self.server = server

       self.sessions = []

       def add(self, session):

       '一个用户进入房间'

       self.sessions.append(session)

       def remove(self, session):

       '一个用户离开房间'

       self.sessions.remove(session)

       def broadcast(self, line):

       '向所有的用户发送指定消息'

       for session in self.sessions:

       session.push(line)

       def do_logout(self, session, line):

       '退出房间'

       raise EndSession

       class LoginRoom(Room):

       """

       åˆšç™»å½•çš„用户的房间

       """

       def add(self, session):

       '用户连接成功的回应'

       Room.add(self, session)

       session.push('Connect Success')

       def do_login(self, session, line):

       '登录命令处理'

       name = line.strip()

       if not name:

       session.push('UserName Empty')

       elif name in self.server.users:

       session.push('UserName Exist')

       else:

       session.name = name

       session.enter(self.server.main_room)

       class ChatRoom(Room):

       """

       èŠå¤©ç”¨çš„房间

       """

       def add(self, session):

       '广播新用户进入'

       session.push('Login Success')

       self.broadcast(session.name + ' has entered the room.\n')

       self.server.users[session.name] = session

       Room.add(self, session)

       def remove(self, session):

       '广播用户离开'

       Room.remove(self, session)

       self.broadcast(session.name + ' has left the room.\n')

       def do_say(self, session, line):

       '客户端发送消息'

       self.broadcast(session.name + ': ' + line + '\n')

       def do_look(self, session, line):

       '查看在线用户'

       session.push('Online Users:\n')

       for other in self.sessions:

       session.push(other.name + '\n')

       class LogoutRoom(Room):

       """

       ç”¨æˆ·é€€å‡ºæ—¶çš„房间

       """

       def add(self, session):

       '从服务器中移除'

       try:

       del self.server.users[session.name]

       except KeyError:

       pass

       class ChatSession(async_chat):

       """

       è´Ÿè´£å’Œå•ç”¨æˆ·é€šä¿¡

       """

       def __init__(self, server, sock):

       async_chat.__init__(self, sock)

       self.server = server

       self.set_terminator('\n')

       self.data = []

       self.name = None

       self.enter(LoginRoom(server))

       def enter(self, room):

       '从当前房间移除自身,然后添加到指定房间'

       try:

       cur = self.room

       except AttributeError:

       pass

       else:

       cur.remove(self)

       self.room = room

       room.add(self)

       def collect_incoming_data(self, data):

       '接受客户端的数据'

       self.data.append(data)

       def found_terminator(self):

       '当客户端的一条数据结束时的处理'

       line = ''.join(self.data)

       self.data = []

       try:

       self.room.handle(self, line)

       except EndSession:

       self.handle_close()

       def handle_close(self):

       async_chat.handle_close(self)

       self.enter(LogoutRoom(self.server))

       class ChatServer(dispatcher):

       """

       èŠå¤©æœåŠ¡å™¨

       """

       def __init__(self, port):

       dispatcher.__init__(self)

       self.create_socket(socket.AF_INET, socket.SOCK_STREAM)

       self.set_reuse_addr()

       self.bind(('', port))

       self.listen(5)

       self.users = { }

       self.main_room = ChatRoom(self)

       def handle_accept(self):

       conn, addr = self.accept()

       ChatSession(self, conn)

       if __name__ == '__main__':

       s = ChatServer(PORT)

       try:

       asyncore.loop()

       except KeyboardInterrupt:

       print

       ä¸‰ã€é¡¹ç›®å®žæˆ˜ï¼ˆå®¢æˆ·ç«¯ï¼‰

       å®Œæˆäº†æœåŠ¡å™¨ç«¯åŽï¼Œå°±éœ€è¦å®žçŽ°å®¢æˆ·ç«¯äº†ï¼Œè¿™é‡Œå®¢æˆ·ç«¯è¿žæŽ¥æœåŠ¡å™¨ä½¿ç”¨äº†telnetlib模块。

       1.登录窗口

       è¿™é‡Œçš„图形界面包选择了wxPython,前面有安装说明,登录窗口通过继承wx.Frame类来实现,代码如下:

       class LoginFrame(wx.Frame):

       """

       ç™»å½•çª—口