这是一个只有简单功能的服务器 写上来 只是为了探讨一下他的原理,以及他的工作方式,这是一个很好的敏捷开发的原型。当然这只是服务器端的,当然你自己也可以写个客户端,代码如下,接下来我们开始分析:
- from asyncore import dispatcher
- from asynchat import async_chat
- import socket,asyncore
- PORT=5005
- NAME='TestChat'
- 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.push('welcome to our chating%s\r\n'%self.server.name)
- def collect_incoming_data(self,data):
- self.data.append(data)
- def found_terminator(self):
- line=''.join(self.data)
- self.data=[]
- self.server.broadcast(line)
- def handle_close(self):
- async_chat.handle_close(self)
- self.server.disconnect(self)
- class ChatServer(dispatcher):
- #get the connection and produce the single chating class and broadcast
- 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.sessions=[]
- def disconnect(self,session):
- self.sessions.remove(session)
- def broadcast(self,line):
- for session in self.sessions:
- session.push(line+'\r\n')
- def handle_accept(self):
- conn,addr = self.accept()
- ChatSession(self,conn)
- if __name__=='__main__':
- s=ChatServer(PORT,NAME)
- try: asyncore.loop()
- 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