基于Socket的网络聊天室

原创 2016年08月30日 22:41:04
from asyncore import dispatcher
from asynchat import async_chat
import socket, asyncore

PORT = 5005
NAME = "ChatRoom"

class EndSession(Exception):pass

class CommandHandler:
    def unknow(self, session, cmd):
        session.push('Unknow commans %s\r\n '% cmd)

    def handle(self, session, line):
        if not line.strip(): return
        parts = line.split(' ',1)
        cmd = parts[0]
        try:line = parts[1].strip()
        except IndexError :line = ' '

        meth = getattr(self, 'do_'+cmd, None)

        try:
            meth(session, line)
        except TypeError:
            self.unknow(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

class LoginRoom(Room):
    def add(self, session):
        Room.add(self,session)
        self.broadcast('welcome to %s \r\n '% self.server.name)
    def unknow(self, session, cmd):
        session.push('Please log 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')
        else:
            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')
    def do_say(self, session, line):
        self.broadcast(session.name+': ' + line + '\r\n')

    def do_look(self, session, line):
        session.push('The following are in 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 loffed 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):
    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):
        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(LoginRoom(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)

if __name__ == '__main__':
    s = ChatServer(PORT,NAME)
    try:asyncore.loop()
    except KeyboardInterrupt: print
版权声明:转载请注明出处。

基于Socket的网络聊天系统开发与设计开题报告

  • 2011年11月22日 12:42
  • 40KB
  • 下载

基于Socket的局域网简易聊天室

主要是通过Socket进行编程 Scoket与ServerSocket交互的过程: 1)服务器端程序创建一个ServerSocket,然后调用accept()方法等待客户端进行连接 2)客户端程...
  • zhegemingzihaonan
  • zhegemingzihaonan
  • 2015年09月17日 21:45
  • 1276

C语言基于socket多人聊天(包含注册登录)

  • 2013年08月08日 16:41
  • 7KB
  • 下载

关于使用UDP实现多人聊天程序的Thinking

有一句话叫做想法是美好的,现实却是残酷的,说得真对啊~。本来天真的以为UDP写的比TCP写的会更简单,效率更高。但是经过实践发现,其复杂度远远超过TCP写的程序。总结如下:1.C-C聊天没问题,逻辑简...
  • qq_18297675
  • qq_18297675
  • 2016年10月18日 14:31
  • 1517

简单多线程socket聊天室程序(c语言)

  • 2013年01月26日 19:42
  • 3KB
  • 下载

基于C/S模式的简单聊天程序(服务器篇)

上篇介绍了客户端的写法,这一篇介绍服务器的写法。 服务器的功能是:接收来自客户端的消息,然后将消息转发给当前连接的所有用户。这里一个困扰我许久的地方是如何存储所有用户的地址(套接字),找了许久我找到了...
  • h843653844
  • h843653844
  • 2015年12月27日 15:17
  • 1828

Socket多人聊天MFC版

源码下载地址: https://github.com/coderxj/Socket-Group-Chat 包括前面C语言版的1V1 和 多人聊天源码都有。coding 环境:VS2015 WIN1...
  • qq_18297675
  • qq_18297675
  • 2016年10月31日 20:50
  • 1686

Socket编程(三)---仿QQ多人聊天实例

这次的实例,目的是为了模仿QQ上和好友聊天的功能,也就是用户登录后,点击用户头像,发送信息,好友就会接受到信息。...
  • oDeviloo
  • oDeviloo
  • 2016年05月21日 15:47
  • 3032

一个简易的聊天程序(Socket)

效果图: 服务端Server代码: using System; using System.Collections.Generic; using System.ComponentMo...
  • duoduoluojia
  • duoduoluojia
  • 2015年05月02日 12:30
  • 1721

TCP/IP Scoket编程之UDP聊天室(C语言实现)

//room.c 文件 #include #include #include #include #include #include #include #include #include...
  • louisluo_77
  • louisluo_77
  • 2012年05月08日 20:39
  • 5449
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于Socket的网络聊天室
举报原因:
原因补充:

(最多只允许输入30个字)