本文实例讲述了Python实现基于C/S架构的聊天室功能。分享给大家供大家参考,具体如下:
本次项目课是实现简单聊天室程序的服务器端和客户端。
服务器端涉及到asyncore
、asynchat
和socket
这几个模块,客户端用到了telnetlib
、wx
、time
和thread
这几个模块。
本次课中编写客户端需要用到wxPython
,它是一个GUI工具包,请先使用下面的命令安装:
$ sudo apt-get install python-wxtools
密码为shiyanlou
登录窗口
聊天窗口
git clone https://github.com/shiyanlou/pythonchat.git
说明:如果你不理解上述代码的下载方式或者下载后在环境中找不到代码,可以点击查看这里
首先需要一个聊天服务器,这里继承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)
有了服务器类还需要能维护每个用户的连接会话,这里继承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))
现在就需要一个命令解释器能够解释用户的命令,例如登录、查询在线用户和发消息等,代码如下:
新闻热点
疑难解答