服务器端代码如下:
- #! /usr/bin/env python
- #coding=utf-8
- from tornado.tcpserver import TCPServer
- from tornado.ioloop import IOLoop
- class Connection(object):
- clients = set()
- def __init__(self, stream, address):
- Connection.clients.add(self)
- self._stream = stream
- self._address = address
- self._stream.set_close_callback(self.on_close)
- self.read_message()
- print "A new user has entered the chat room.", address
- def read_message(self):
- self._stream.read_until('\n', self.broadcast_messages)
- def broadcast_messages(self, data):
- print "User said:", data[:-1], self._address
- for conn in Connection.clients:
- conn.send_message(data)
- self.read_message()
- def send_message(self, data):
- self._stream.write(data)
- def on_close(self):
- print "A user has left the chat room.", self._address
- Connection.clients.remove(self)
- class ChatServer(TCPServer):
- def handle_stream(self, stream, address):
- print "New connection :", address, stream
- Connection(stream, address)
- print "connection num is:", len(Connection.clients)
- if __name__ == '__main__':
- print "Server start ......"
- server = ChatServer()
- server.listen(8000)
- IOLoop.instance().start()
经测试后发现,tornado的接收方法里,已经做了粘包处理。比如第18行的代码,就是用的tornado.iostream.BaseIOStream类的read_until(delimiter, callback) 方法。这个方法,将会从缓冲区里,直到读到截止标记(比如'\n'),就产生一次回调。如果没有截止标记,缓冲区就攒数据,直到等到截止标记出现,才会产生回调。看了一下源码,缓冲区默认是max_buffer_size=104857600 。