• 大小: 9KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: Python
  • 标签: IRC  PYTHON  chat  r  

资源简介

利用python来完成IRC协议的实现以及系统研制,目标是能够实现点对点IRC以及通过python构建在线IRC聊天室。

资源截图

代码片段和文件信息

# -*- coding: utf-8 -*-
import socket
import asyncore
import asynchat

host = ‘127.0.0.1‘# 即本地IP地址
port = 5000
# hall_name = ‘Learning‘

class EndSession(Exception):pass  #用于产生异常,退出

class CommandHandler:
    ‘‘‘
    消息处理。
    根据用户发来的消息进行判断,并调用对应的实例方法。
    分为‘/‘开头的命令,和普通的消息。
    ‘‘‘
    def handle(self session line):
        ‘‘‘
        尝试对消息进行拆分、判断
        ‘‘‘
        if not line: return
        #print line
        parts = line.split(‘ ‘ 1)
        #print parts
        if parts[0][0] == ‘/‘: # 检查是否命令,命令格式:/cmd
            cmd = parts[0][1:]
            #print cmd
            try:
                line = parts[1].strip()
                #print line
            except IndexError:
                line = None
            meth = getattr(self ‘do_‘+cmd None)  # 查看用户所在的房间是否有该属性/方法。self ,和 房间绑定
            # print meth
            # >
            # >
            try:
                meth(session line)
            except TypeError:
                self.unknow(session cmd)
        else:   # 对于普通的聊天信息,默认直接调用 ‘do_broadcast‘ 方法广播给房间内其他人
            meth = getattr(self ‘do_broadcast‘ line)
            try:
                meth(session line)
            except TypeError:
                self.unknow(session line)

    def unknow(self session cmd):
        ‘‘‘
        当找不到相应的命令时,进行提示
        ‘‘‘
        session.send(‘Unknow command: %s\r\n‘ % cmd)

class Room(CommandHandler):
    ‘‘‘
    房间的会话管理,继承了 ‘CommandHandler‘ 类
    ‘‘‘
    def __init__(self server room_name):
        ‘‘‘
        初始化房间,每个房间保存当前用户的会话列表,服务器实例,房间名称
        ‘‘‘
        self.sessions = []
        self.server = server
        self.room_name = room_name

    def add(selfsession):
        self.sessions.append(session)

    def remove(selfsession):
        self.sessions.remove(session)

    def broadcast(self session line):
        ‘‘‘
        广播消息给房间内,除自己外的所有人
        ‘‘‘
        # print session‘ session‘
        # print self.sessions‘ self.sessions‘
        for i in self.sessions:
            if i != session:
                i.send(line + ‘\r\n‘)

    def do_logout(selfsessionline):
        raise EndSession

class Server(asyncore.dispatcher):
    ‘‘‘
    服务器类
    ‘‘‘
    def __init__(self port host):
        ‘‘‘
        初始化服务器,开始侦听用户的服务请求。
        以字典方式保存所有用户的 client_name 和 session 映射信息,避免昵称冲突
        初始化 Hall 以及 三个聊天室
        ‘‘‘
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host port))
        self.listen(5)
        self.users = {} # 用于比较是否有昵称冲突
        self.hall = Hall(self ‘Hall‘)   # server 启动便实例化 Hall ,作为 server 属性。同时 ,初始化hall,将 server 存为 hall 属性
        self.python = ChatRoom(self ‘python‘)
        self.write = ChatR

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      10737  2019-01-21 03:27  SourceCode\IRC.py

     文件       8901  2019-01-16 15:10  SourceCode\mtTkinter.py

     文件       9059  2019-01-21 03:31  SourceCode\tk.py

     目录          0  2019-01-21 03:47  SourceCode

----------- ---------  ---------- -----  ----

                28697                    4


评论

共有 条评论