这里的初学者试图从低层次了解websocket的工作方式。我正在尝试创建自己的实现,但是我对解析从client => server发送来的数据帧的逻辑感到非常困惑。
我知道在服务器端接收到的缓冲区由多个字节组成,其中前两个是主要标头信息(fin位,长度,操作码,掩码等)。
我在SO上找到了以下代码,可以解析这两个字节,并且从测试来看,它确实返回了正确的值。
let index = 0;
frame = {
data: new Buffer(0),
fin: (buffer[index] & 128) === 128,
length: buffer[index + 1] & 127,
masked: (buffer[index + 1] & 128) === 128,
opcode: buffer[index] & 15
}
我主要的问题是什么......这到底是如何返回正确的值?
我知道buffer [index]和buffer [index + 1]分别指的是第一个字节和第二个字节,并且AND操作数用于比较每个字节的二进制值,并且当两个数字中的两个索引相等时输出1到1,否则为0 ......但是...
&运算符后面的数字从哪里来?例如:操作码为15,长度为127。
在这两个值上使用AND运算符究竟能给出正确的结果吗?这是我真的不明白。
对于这是我不了解的基本计算机科学概念,我深表歉意,但是如果在那里有人能够向我解释此代码的确切含义,将不胜感激。
答案 0 :(得分:0)
我知道它看起来像是一个普通的AND比较,但它是布尔布尔AND比较。
为更明确一点,操作码的buffer [index]和15表示将buffer [index]的二进制数与15(这是websocket允许的最高操作码)的二进制数进行比较,并逐位返回二进制结果以整数形式显示,操作码本身会告诉您正在发送哪种帧类型。(如果您好奇,可以在https://tools.ietf.org/html/rfc6455#section-11.8进行深入了解。)
在127的长度部分,我会在SO上引用此答案,因为它是一个可靠的答案:how to work out payload size from html5 websocket
要进一步了解运算符,请参阅我的资料中有关按位逻辑运算符的部分。
来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators