我正在开发一个与 native 消息传递主机配合使用的 Chrome 扩展程序。 它在大多数情况下都有效,但当我发送特定大小的消息时,我发现了奇怪的行为。 当大小在 2560 到 2815 字节(十六进制的 A00 和 AFF)之间时,消息似乎被丢弃。所有后续消息也未到达,这表明该流由于某种原因已损坏。
这是一个精简的 Python native 消息应用程序,可用于测试它:
import sys
import struct
def output(message):
encoded_message = message.encode('utf-8')
# Write message size.
sys.stdout.write(struct.pack('I', len(encoded_message)))
# Write the message itself.
sys.stdout.write(encoded_message)
sys.stdout.flush()
if __name__ == "__main__":
output('{"type": "%s"}' % ('x'*2820))
output('{"type": "%s"}' % ('x'*2560))
我收到第一条消息,而不是第二条消息。
我查看了 Chrome repository 中的代码。 Function 似乎负责该功能,但没有任何特殊之处:
void NativeMessageProcessHost::ProcessIncomingData(
const char* data, int data_size) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
incoming_data_.append(data, data_size);
while (true) {
if (incoming_data_.size() < kMessageHeaderSize)
return;
size_t message_size =
*reinterpret_cast<const uint32*>(incoming_data_.data());
if (message_size > kMaximumMessageSize) {
LOG(ERROR) << "Native Messaging host tried sending a message that is "
<< message_size << " bytes long.";
Close(kHostInputOuputError);
return;
}
if (incoming_data_.size() < message_size + kMessageHeaderSize)
return;
content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
base::Bind(&Client::PostMessageFromNativeProcess, weak_client_ui_,
destination_port_,
incoming_data_.substr(kMessageHeaderSize, message_size)));
incoming_data_.erase(0, kMessageHeaderSize + message_size);
}
}
有人知道这里可能发生什么吗?
更新
我在 64 位版本的 Windows 7 和 Windows 8.1 上遇到过此问题。
我在稳定版、测试版和开发版 channel 上尝试了 64 位 Chrome - 版本 37、38 和 39。 我也尝试过稳定的 Chrome 32 位
我使用 32 位版本的 Python 2.7.7 和 PyInstaller 2.1 为 native 消息传递主机创建可执行文件。
最佳答案
由于您使用的是 Windows,我怀疑 Windows 将回车符 (\x0D
) 添加到换行符 (\x0A
)。
根据Python 2.x - Write binary output to stdout? ,防止在 Windows 上修改输出流的一种方法是在将任何内容写入 stdout 之前使用以下代码片段。
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
关于python - Chrome native 消息传递不接受特定大小的消息 (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163089/