服务器:
from tornado import ioloop, web, gen
class MainHandler(web.RequestHandler):
@gen.coroutine
def get(self):
self.write('1' * 1024)
self.flush(callback=(yield gen.Callback('flush')))
yield gen.Wait('flush')
print 'First chunk sent'
self.write('2' * 1024)
self.flush(callback=(yield gen.Callback('flush')))
yield gen.Wait('flush')
print 'Second chunk sent'
self.finish()
application = web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8000)
ioloop.IOLoop.instance().start()
客户:
import urllib2
urllib2.urlopen('http://127.0.0.1:8000/').close()
请求后,我在服务器控制台中看到:
First chunk sent
Second chunk sent
但我希望在那里看不到任何东西。我不懂什么?
答案 0 :(得分:1)
您希望在客户端读取该字节数之前阻塞flush()吗?
flush()仅确保您已将字节写入OS的网络输出缓冲区。缓冲区可能远大于3k。在我的Linux机器上,它大约是200k:
$ cat /proc/sys/net/core/wmem_default
212992
在客户端阅读您的消息之前,无法阻止。如果您需要等到客户端收到消息,客户端应发送确认消息,您应该听取它。
答案 1 :(得分:0)
问题在于urllib2。它适用于下一个socket-baset客户端:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8000))
s.send("GET / HTTP/1.0\r\n\r\n")
s.close()