python多台电脑聊天室_python的多人多功能聊天室
从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的多人多功能聊天室相关推荐
- python两台电脑文件传输_python实现简单socket程序在两台电脑之间传输消息的方法...
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python聊天小程序支持私聊和多人_Python实现多人在线匿名聊天的小程序
最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码. 在线聊天地址(无需登录,开一个窗 ...
- Python两台电脑实现TCP通信
为了实现Nao机器人与电脑端的TCP通信,于是研究了一下Python实现TCP通信,在网上也看到了很多例子,但大多都是在一台机器上验证.在两台机器上使用,出了一些小故障. 注意:若两台电脑通信出了问题 ...
- python聊天小程序支持私聊和多人_Python实现多人在线匿名聊天的小程序-阿里云开发者社区...
最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码. 在线聊天地址(无需登录,开一个窗 ...
- python两台电脑网络互传信息,Python+pyftpdlib实现局域网文件互传
在同一个局域网的多台电脑,传递文件时可以通过 搭建web服务器,设置目录浏览的方式快速分享.如果上传就比较麻烦了,通过qq/微信会产生很多文件记录,通过teamviewer太慢,ftp是一个不错的选择 ...
- python远程聊天_Python实现多人在线匿名聊天的小程序
最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码. 在线聊天地址(无需登录,开一个窗 ...
- java 在线聊天室_一万人一起在线聊天的聊天室,怎样用Java实现?
原标题:一万人一起在线聊天的聊天室,怎样用Java实现? 今天逛论坛的时候发现一个Java Socket实现多人聊天室的源码,感觉写得还不错,至少算个有模有样的聊天工具.虽然有点简单,但是也算是一个项 ...
- python socket多线程 获取朋友列表_python socket多线程通讯实例分析(聊天室)
本文实例讲述了python socket多线程通讯方法.分享给大家供大家参考,具体如下: #!/usr/bin/evn python """ 这是一个Socket+多进程 ...
- python项目之网络聊天室_Python实现多人聊天室
项目简介 编程语言:Python3 界面实现:Pyside2(通过QT Designer设计) 基于TCP网络编程 项目概略图: 实现功能 (1) 客户端通过服务器访问数据库,进行登录注册 (2) ...
最新文章
- 重磅开源!所有的李航老师《统计学习方法》算法代码实现!!!
- parse函数 python_python的parse_args()函数
- 算法习题---线性表之单链表逆序打印
- 数字中国建设再提速,智慧金融发展如何跑出“加速度”?
- [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用
- 7.1.16 jQueray的鼠标事件
- Java 7:HashMap与ConcurrentHashMap
- 阿里云SLB负载均衡与使用SSL域名证书
- lucene详细说明文档
- macOS完整项目源码之macOS动态壁纸创建工具(教程含源码)
- 【协议分析】WAP1.x协议栈浅析-WSP协议
- 羊车门问题。有三扇关闭的门,一扇门背后面停着汽车,其余门后面是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另一扇门,露出门后的山羊,然后允许参赛者更换自己的选
- 怎样用ipad录制游戏视频?ipad如何录制视频?
- CSGO 详细控制台指令(更新中)
- 物理机ping通Centos虚拟机,但虚拟机ping不通物理机的解决方法
- 小红书美妆报告:18岁以下群体对美妆消费量提升158%
- JZOJ 7066. 【2021.4.24 NOI模拟】ehzeux与圆周(DP)
- linux使用usb刻录光驱,linux光驱刻录
- wpg闪电充:石墨烯你应该要了解的新型材料
- DeepSpectra: An end-to-end deep learning approach for quantitative spectral analysis翻译