我正在实现一个websocket服务器,我有一个问题,即模块SocketServer的rfile.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字节读取。有关正在发生的事情的任何想法?
答案 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()
返回一个空字符串是有效的。