SocketServer通过读取0个字节来解除阻塞

时间:2015-02-05 11:12:51

标签: python websocket blocking socketserver

我正在实现一个websocket服务器,我有一个问题,即模块SocketServerrfile.read在读取0字节时偶尔会解锁。大多数情况下这很好,直到我开始来回发送随机请求。

以下是我的代码中的一个片段:

class WebSocketHandler(StreamRequestHandler):
    ..
    def read_next_message(self):
        b1 = self.rfile.read(1)
        b2 = self.rfile.read(1)
        print("Length is %d %d" % (len(b1), len(b2)))
        ..
    ..

正确输出:

Length is 1 1
Length is 1 1
Length is 1 1
..

偶尔的搞砸输出:

Length is 0 0
(Error ..)

这是非常奇怪的行为,因为一旦读取 1个字节,我希望self.rfile.read(1)取消阻止 ONLY 。现在它取消阻止 0字节读取。有关正在发生的事情的任何想法?

2 个答案:

答案 0 :(得分:0)

当套接字连接断开并且没有“EOT”(传输结束)发送到您的服务器时,会发生这种情况。

答案 1 :(得分:0)

read()在文件末尾返回一个空字符串(长度为0)。

rfile映射到套接字(从socket.makefile()获取),在这种情况下,读取0字节表示远程客户端关闭了连接,或者连接因某种原因被破坏

以下是一些演示代码:

import SocketServer

class MyHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        while True:
            c = self.rfile.read(1)
            print "read %d bytes: %r" % (len(c), c)
            if len(c) == 0:
                print "end of file / socket closed"
                break

if __name__ == '__main__':
    import sys

    port = 1234
    if len(sys.argv) > 1:
        port = int(sys.argv[1])

    server = SocketServer.TCPServer(("", port), MyHandler)
    server.serve_forever()

运行上述代码并使用nc(或telnet)连接到服务器:

$ nc 0.0.0.0 1234
hello
^D

^D是Ctrl-D,它关闭与服务器的连接。服务器应该发出:

read 1 bytes: 'h'
read 1 bytes: 'e'
read 1 bytes: 'l'
read 1 bytes: 'l'
read 1 bytes: 'o'
read 1 bytes: '\n'
read 0 bytes: ''
end of file / socket closed

你可以看到read()返回一个空字符串是有效的。