首页 > 编程 > Python > 正文

Python实现基于C/S架构的聊天室功能详解

2020-02-15 22:13:46
字体:
来源:转载
供稿:网友

本文实例讲述了Python实现基于C/S架构的聊天室功能。分享给大家供大家参考,具体如下:

一、课程介绍

1.简介

本次项目课是实现简单聊天室程序的服务器端和客户端。

2.知识点

服务器端涉及到asyncoreasynchatsocket这几个模块,客户端用到了telnetlibwxtimethread这几个模块。

3.所需环境

本次课中编写客户端需要用到wxPython,它是一个GUI工具包,请先使用下面的命令安装:

$ sudo apt-get install python-wxtools

密码为shiyanlou

4.项目效果截图

登录窗口

聊天窗口

5.源代码下载

git clone https://github.com/shiyanlou/pythonchat.git

说明:如果你不理解上述代码的下载方式或者下载后在环境中找不到代码,可以点击查看这里

二、项目实战(服务器端)

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.命令解释器

现在就需要一个命令解释器能够解释用户的命令,例如登录、查询在线用户和发消息等,代码如下:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表