从Beginning Python: From Novice to Professional, Second Edition 中的一个chatroom项目中拿出来的。那里的聊天室,只有一个单间聊天室功能,使用asyncore和asynchat实现,只能群聊。后来我给它加上了多人聊天室功能。还加上了私聊等功能。改用twisted实现并把它变成了守护模式(使用twistd)

命令列表:

/login username [roomname]

/who 查看当前登录的用户

/look 查看在当前聊天房间的用户

/to username content 私信用户

/exit 退出当前聊天房间

/logout 退出聊天服务器

代码如下:

from twisted.internet import reactor

from twisted.internet.protocol import Protocol,Factory

from twisted.internet import defer

from twisted.protocols.basic import LineReceiver

from twisted.application import internet,service

from twisted.python import log

class commaneHandler:

def handle(self,session,line):

if not line.strip():return

parts=line.split(' ',1)

cmd=parts[0].strip()

try:

if cmd[0]!='/':

cmd="/say"

line=line.strip()

else:

line=parts[1].strip()

except IndexError:

line=""

finally:

cmd=cmd[1:].strip()

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

try:

meth(session,line)

except TypeError:

self.unknow(session,cmd)

def unknow(self,session,cmd):

session.write("%s:unknow command!\n"%cmd)

class Room(commaneHandler):

def __init__(self,server,name=""):

self.server=server

self.roomName=name

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.write(line+'\n')

def do_list(self,session,line):

session.write("list for ChatRoom\n")

for room in self.server.rooms:

session.write(room+'\n')

def do_logout(self,session,line):

session.entry(LogoutRoom(self.server))

session.d.errback("")

class LoginRoom(Room):

def add(self,session):

Room.add(self,session)

log.msg("Connection from %s "%session.session.getPeer())

session.write("Welcome to ChatTest for twisted v1.1!\n")

def do_login(self,session,line):

parts=line.strip().split(" ")

name=parts[0]

if not name:

session.write("Please entry a name\n")

elif name in self.server.users:

session.write("The name %s is token\n"%name)

else:

session.name=name

try:

roomName=parts[1]

except IndexError:

roomName="main"

if not roomName in self.server.rooms:

self.server.createRoom(roomName)

session.entry(self.server.rooms[roomName])

def unknow(self,session,line):

session.write("Commands:login logout list\n")

class LogoutRoom(Room):

def add(self,session):

try:

del self.server.users[session.name]

except KeyError:

pass

class ChatRoom(Room):

def add(self,session):

session.write("Welcome to ChatRoom:%s !\n"%self.roomName)

mess=session.name+" has join the room"

self.broadcast(mess)

log.msg(mess)

Room.add(self,session)

self.server.users[session.name]=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("%s: %s"%(session.name,line))

def do_look(self,session,line):

session.write("list for room:\n")

for i,other in enumerate(self.sessions):

session.write("%d: %s\n"%(i,other.name))

def do_exit(self,session,line):

try:

del self.server.users[session.name]

except KeyError:

pass

session.entry(LoginRoom(self.server))

def do_to(self,session,line):

try:

parts=line.split(' ',1)

name=parts[0]

line=parts[1]

toUser=self.server.users[name]

toUser.write("%s: %s\n"%(session.name,line))

except IndexError:

session.write("Usage:/to toUser line\n")

return False

except KeyError:

session.write("%s does not exist!\n"%name)

return False

def do_who(self,session,line):

session.write("list for server:\n")

for i,name in enumerate(self.server.users.keys()):

session.write("%d: %s\n"%(i,name))

class chatSession:

def __init__(self,server,session,d):

self.d=d

self.server=server

self.session=session

self.name=None

self.entry(LoginRoom(self.server,""))

def write(self,line):

self.session.write(line)

def entry(self,room):

try:

cur=self.room

except AttributeError:

pass

else:

cur.remove(self)

self.room=room

room.add(self)

def execComm(self,line):

self.room.handle(self,line.strip())

class ChatProtocol(LineReceiver):

def connectionMade(self):

d=defer.Deferred()

d.addBoth(self.endSession)

self.s=chatSession(self.factory,self.transport,d)

def endSession(self,_):

self.transport.loseConnection()

def connectionLost(self,reason):

pass

def connectionFailure(self,connector,reason):

print reason

def lineReceived(self,line):

self.s.execComm(line)

class ChatFactory(Factory):

protocol=ChatProtocol

def __init__(self):

self.users={}

self.rooms={}

self.createRoom("main")

def createRoom(self,name):

self.rooms[name]=ChatRoom(self,name)

port=1234

iface="localhost"

application=service.Application("chatRoom")

top_service=service.MultiService()

factory=ChatFactory()

tcp_service=internet.TCPServer(port,factory,

interface=iface)

tcp_service.setServiceParent(top_service)

top_service.setServiceParent(application)

输出:

ljd&11:44:51:py$ twistd -n -y tw_chatRoom.py

2014-06-21 11:45:01+0800 [-] Log opened.

2014-06-21 11:45:01+0800 [-] twistd 11.1.0 (/usr/bin/python 2.7.3) starting up.

2014-06-21 11:45:01+0800 [-] reactor class: twisted.internet.pollreactor.PollReactor.

2014-06-21 11:45:01+0800 [-] ChatFactory starting on 1234

2014-06-21 11:45:01+0800 [-] Starting factory <__builtin__.chatfactory instance at>

2014-06-21 11:45:09+0800 [__builtin__.ChatFactory] Connection from IPv4Address(TCP, '127.0.0.1', 58755)

2014-06-21 11:45:23+0800 [ChatProtocol,0,127.0.0.1] abc has join the room

python多台电脑聊天室_python的多人多功能聊天室相关推荐

  1. python两台电脑文件传输_python实现简单socket程序在两台电脑之间传输消息的方法...

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  2. python聊天小程序支持私聊和多人_Python实现多人在线匿名聊天的小程序

    最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码. 在线聊天地址(无需登录,开一个窗 ...

  3. Python两台电脑实现TCP通信

    为了实现Nao机器人与电脑端的TCP通信,于是研究了一下Python实现TCP通信,在网上也看到了很多例子,但大多都是在一台机器上验证.在两台机器上使用,出了一些小故障. 注意:若两台电脑通信出了问题 ...

  4. python聊天小程序支持私聊和多人_Python实现多人在线匿名聊天的小程序-阿里云开发者社区...

    最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码. 在线聊天地址(无需登录,开一个窗 ...

  5. python两台电脑网络互传信息,Python+pyftpdlib实现局域网文件互传

    在同一个局域网的多台电脑,传递文件时可以通过 搭建web服务器,设置目录浏览的方式快速分享.如果上传就比较麻烦了,通过qq/微信会产生很多文件记录,通过teamviewer太慢,ftp是一个不错的选择 ...

  6. python远程聊天_Python实现多人在线匿名聊天的小程序

    最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码. 在线聊天地址(无需登录,开一个窗 ...

  7. java 在线聊天室_一万人一起在线聊天的聊天室,怎样用Java实现?

    原标题:一万人一起在线聊天的聊天室,怎样用Java实现? 今天逛论坛的时候发现一个Java Socket实现多人聊天室的源码,感觉写得还不错,至少算个有模有样的聊天工具.虽然有点简单,但是也算是一个项 ...

  8. python socket多线程 获取朋友列表_python socket多线程通讯实例分析(聊天室)

    本文实例讲述了python socket多线程通讯方法.分享给大家供大家参考,具体如下: #!/usr/bin/evn python """ 这是一个Socket+多进程 ...

  9. python项目之网络聊天室_Python实现多人聊天室

    项目简介 编程语言:Python3 界面实现:Pyside2(通过QT Designer设计) 基于TCP网络编程 项目概略图: 实现功能 (1)   客户端通过服务器访问数据库,进行登录注册 (2) ...

最新文章

  1. 重磅开源!所有的李航老师《统计学习方法》算法代码实现!!!
  2. parse函数 python_python的parse_args()函数
  3. 算法习题---线性表之单链表逆序打印
  4. 数字中国建设再提速,智慧金融发展如何跑出“加速度”?
  5. [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用
  6. 7.1.16 jQueray的鼠标事件
  7. Java 7:HashMap与ConcurrentHashMap
  8. 阿里云SLB负载均衡与使用SSL域名证书
  9. lucene详细说明文档
  10. macOS完整项目源码之macOS动态壁纸创建工具(教程含源码)
  11. 【协议分析】WAP1.x协议栈浅析-WSP协议
  12. 羊车门问题。有三扇关闭的门,一扇门背后面停着汽车,其余门后面是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另一扇门,露出门后的山羊,然后允许参赛者更换自己的选
  13. 怎样用ipad录制游戏视频?ipad如何录制视频?
  14. CSGO 详细控制台指令(更新中)
  15. 物理机ping通Centos虚拟机,但虚拟机ping不通物理机的解决方法
  16. 小红书美妆报告:18岁以下群体对美妆消费量提升158%
  17. JZOJ 7066. 【2021.4.24 NOI模拟】ehzeux与圆周(DP)
  18. linux使用usb刻录光驱,linux光驱刻录
  19. wpg闪电充:石墨烯你应该要了解的新型材料
  20. DeepSpectra: An end-to-end deep learning approach for quantitative spectral analysis翻译

热门文章

  1. python的100道简单习题,祝你成为python大神的小老弟
  2. 数字电路:半加器和全加器实验
  3. alias常见小问题汇总20例
  4. 在Mac上安装Ruby on Rails
  5. 网站向bing搜索提交URL
  6. 如何将网站提交到百度的办法
  7. U盘数据不见了怎么恢复?
  8. 施工企业选择智慧工地的有效方法
  9. DICOM医学图像处理:BMP转DCM、DCM转BMP、多张BMP转DCM、JPG转DCM,,多张JPG转DCM。
  10. “微盟事件”星瑞格(Sino-DB)产品解决方案