本文實例講述了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))
現在就需要一個命令解釋器能夠解釋用戶的命令,例如登錄、查詢在線用戶和發消息等,代碼如下:
新聞熱點
疑難解答