python之虚拟聊天室之简单的服务器

来源:互联网 发布:夜来风雨声花落知多少 编辑:程序博客网 时间:2024/05/16 18:09

这是一个只有简单功能的服务器 写上来 只是为了探讨一下他的原理,以及他的工作方式,这是一个很好的敏捷开发的原型。当然这只是服务器端的,当然你自己也可以写个客户端,代码如下,接下来我们开始分析:

  1. from asyncore import dispatcher  
  2. from asynchat import async_chat  
  3. import socket,asyncore  
  4.  
  5. PORT=5005 
  6. NAME='TestChat' 
  7. class ChatSession(async_chat):  
  8.     def __init__(self,server,sock):  
  9.         async_chat.__init__(self,sock)  
  10.         self.server=server  
  11.         self.set_terminator("\r\n")  
  12.         self.data=[]  
  13.         self.push('welcome to our chating%s\r\n'%self.server.name)  
  14.     def collect_incoming_data(self,data):  
  15.         self.data.append(data)  
  16.     def found_terminator(self):  
  17.         line=''.join(self.data)  
  18.         self.data=[]  
  19.         self.server.broadcast(line)  
  20.     def handle_close(self):  
  21.         async_chat.handle_close(self)  
  22.         self.server.disconnect(self)  
  23. class ChatServer(dispatcher):  
  24.     #get the connection and produce the single chating class and broadcast  
  25.     def __init__(self,port,name):  
  26.         dispatcher.__init__(self)  
  27.         self.create_socket(socket.AF_INET,socket.SOCK_STREAM)  
  28.         self.set_reuse_addr()  
  29.         self.bind(('',port))  
  30.         self.listen(5)  
  31.         self.name=name  
  32.         self.sessions=[]  
  33.     def disconnect(self,session):  
  34.         self.sessions.remove(session)  
  35.     def broadcast(self,line):  
  36.         for session in self.sessions:  
  37.             session.push(line+'\r\n')  
  38.     def handle_accept(self):  
  39.         conn,addr = self.accept()  
  40.         ChatSession(self,conn)  
  41. if __name__=='__main__':  
  42.     s=ChatServer(PORT,NAME)  
  43.     try: asyncore.loop()  
  44.     except KeyboardInterrupt:print 

当然首先这是一个可以接受连接的服务器,而且可以同时进行2个以上的客户端连接。

ChatServer类继承了来自asyncore的dispatcher,而dispatcher基本就是一个套接字对象。接着下面有几个函数

 disconnect 和broadcast 这个2个函数是为了 满足客户端断开的时候将其移除会话列表,和将用户的发言广播到大厅,而 handle_accept(self)就是接受来自 accept Found at: asyncore的return either an address pair作为参数传到chatsession。

我们在分析ChatSession类,他能做到收集客户端的数据文本并进行响应,这当然得益于asynchat模块,我们只需要继承并重写其中的2个方法就可以了,其中一个是collect_incoming_data

这个函数主要目的是将数据加到data会话列表中。

found_terminator

这是发现中止符号的时候执行的 在这个例子中设定的终止符是“\r\n”,此处中止的时候执行broadcast,

还有一个handle_close

处理发现客户端断开连接后的处理。就是直接将其从会话列表中删除

本文出自 “LuoZhengWu” 博客,请务必保留此出处http://brucemars.blog.51cto.com/5288106/960964

0 0
原创粉丝点击