文档章节

简单聊天系统

姐夫
 姐夫
发布于 2012/06/27 19:05
字数 547
阅读 134
收藏 2

简单聊天系统

 

from asyncore import dispatcher
from asynchat import async_chat
import socket, asyncore

PORT = 5555
NAME = 'ChatRoom V1.0'

class EndSession(Exception):
    pass

class CommandHandler:
    
    def unknown(self, session, cmd):
        session.push("Unknown command: %s\r\n" % cmd)

    def handle(self, session, line):
        if not line.strip():
            return
        
        parts = line.split(' ', 1)
        cmd = parts[0]
        cmd = cmd.lower()
        
        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        

    def do_help(self, session, line):
        self.broadcast('--------------------------------------------------\r\n')
        self.broadcast('Command          Description\r\n')
        self.broadcast('--------------------------------------------------\r\n')
        self.broadcast('login <name>     login server with name\r\n')
        self.broadcast('logout           logout server\r\n')
        self.broadcast('say <statement>  using for chat\r\n')
        self.broadcast('look             find users in same room\r\n')
        self.broadcast('who              find users login server\r\n')
        self.broadcast('--------------------------------------------------\r\n')


class LoginRoom(Room):
    
    def add(self, session):
        Room.add(self, session)
        self.broadcast('==================================================\r\n')
        self.broadcast('Welcome to %s\r\n' % self.server.name)
        self.broadcast('==================================================\r\n')
        self.broadcast('--------------------------------------------------\r\n')
        self.broadcast('Type "help" command to get command list\r\n')
        self.broadcast('--------------------------------------------------\r\n')


    def unknow(self, session, cmd):
        session.push('Please login in\nUse "Login <nick>"\r\n')
    
    def do_login(self, session, line):
        name = line.strip()
        
        if not name:
            session.push('Please enter a name\r\n')
        elif name in self.server.users:
            session.push('The name "%s" is taken.\r\n' %name)
            session.push('Please try again.\r\n')
        else:
            session.push('"%s" login successfully.\r\n' %name)
            session.name = name
            session.enter(self.server.main_room)
            
class ChatRoom(Room):
    
    def add(self, session):
        self.broadcast(session.name + ' has entered the room.\r\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.\r\n')
    
    def do_say(self, session, line):
        self.broadcast(session.name + ': ' + line + '\r\n')
        # record say

    def do_look(self, session, line):
        session.push('The following are in this Room:\r\n')
        for other in self.sessions:
            session.push(other.name + '\r\n')
     
    def do_who(self, session, line):
        session.push('The following are logged in:\r\n')
        for name in self.server.users:
            session.push(name + '\r\n')
            
class LogoutRoom(Room):
    
    def add(self, session):
        try:
            del self.server.users[session.name]
        except KeyError:
            pass
    
class ChatSession(async_chat):
    """
    A class that take care of a connection between
    the server and a single user
    """
    def __init__(self,server,sock):
        async_chat.__init__(self, sock)
        self.server = server
        self.set_terminator("\r\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):
        """
        If a terminator found, that means that a full 
        line has been read. Broadcast it to every one.
        """
        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,name):
        dispatcher.__init__(self)
        self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind(('', port))
        self.listen(5)
        self.name = name
        self.users = {}        
        self.main_room = ChatRoom(self)
    
    def handle_accept(self):
        conn, addr = self.accept()
        ChatSession(self, conn)
        # record the login status


if __name__ == '__main__':
    s = ChatServer(PORT,NAME)
    try: asyncore.loop()
    except KeyboardInterrupt: print

 

简单聊天系统

© 著作权归作者所有

姐夫
粉丝 49
博文 34
码字总数 8509
作品 0
浦东
程序员
私信 提问
Nextalk专业社区网站即时通讯系统,5.7版本正式发布。

NexTalk简单专业、开放源码的网站即时消息系统 NexTalk是专为网站设计的简单专业,开放源码的即时消息系统。可快速为社区网站、电子商务网站、企业网站提供即时消息服务。 NexTalk可为电子商...

lee8913151
2014/10/16
9
0
Grails示例程序-一个简单的聊天室

整个聊天室由两个界面组成,第一个界面用来注册用户的昵称。提交后,显示聊天页面,用户可以开始聊天。界面上部显示聊天信息。用户可以在界面底部输入消息,输入消息后回车提交。 Domain 首先...

寡鸡蛋
2014/01/16
831
0
Web聊天室--PhpFreeChat

php Free Chat是一个免费,安装简单,快捷, 可定制和多语言支持的聊天程序,使用文件系统来储存消息和昵称。它使用Ajax的技术无刷新显示聊天信息与昵称,利用CSS支持自定主题并且可以通过插件 ...

匿名
2008/09/25
10.5K
0
如何利用paddlepaddle做一个简单的聊天机器人 | 公开课

分享背景 ▼ 语音助手,也称为聊天机器人作为人工智能交互的入口之一,其战略地位,好比百度之于PC,微信之于手机,已经成为巨头兵家必争之地。什么是聊天机器人,聊天机器人又有哪些难点,本...

y0w1as5eg37urfds
2017/12/18
0
0
phpFreeChat 1.3 发布,Web聊天室

php Free Chat是 一个免费,安装简单,快捷, 可定制和多语言支持的聊天程序,使用文件系统来储存消息和昵称。它使用Ajax的技术无刷新显示聊天信息与昵称,利用CSS支持自定主题并且可以通过插件 ...

红薯
2010/04/13
845
0

没有更多内容

加载失败,请刷新页面

加载更多

一次看懂 Https 证书认证

TLS > 传输层安全性协定 TLS(Transport Layer Security),及其前身安全套接层 SSL(Secure Sockets Layer)是一种安全协议,目的是为网际网路通信,提供安全及数据完整性保障。 如图,TLS...

极客收藏夹
38分钟前
4
0
https证书买哪家好?有哪些供应商

在选购https证书前除了要了解类型外,还需要了解https证书供应商,毕竟不同的供应商,提供的产品质量与服务也是有差异的。今天小编就为大家讲讲https证书供应商方面的内容,希望各位会喜欢。...

安信证书
40分钟前
5
0
Zuul 配置

概述:zuul底层是基于servlet,是由一系列的filter链构成。 1、路由配置 a、单例serverId映射 zuul: routes: client-a: path: /client/** serviceId: client-a 意思是...

java框架开发者
57分钟前
3
0
zk中FinalRequestProcessor解析

是处理器最后一个环节 FinalRequestProcessor implements RequestProcessor 处理器链最后一个环节处理事务和非事务请求最后一个环节 构造器 public FinalRequestProcessor(ZooKeeperServer z...

writeademo
57分钟前
4
0
Axios 详解

首先祝广大程序猿们节日快乐! 一、axios简介 基于promise,用于浏览器和node.js的http客户端 二、特点 支持浏览器和 node.js 支持 promise 能拦截请求和响应 能转换请求和响应数据 能取消请求...

张兴华ZHero
58分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部