我正在开发一个客户端-服务器应用程序,并负责添加对在 websockets 上运行的支持。我在服务器端使用 Cowboy,并且一直在使用 Erlang websocket 客户端进行测试。
事情应该是这样的:
- 客户端打开套接字连接并开始 http 握手
- 服务器完成http握手
- 客户端向服务器发送消息,服务器发送回复
- 客户端处理回复
- 重复 3 & 4
客户端模块实现
handle_info({Transport, Socket, Data}, StateName, State) ->
... do stuff with data ...
当数据出现时,它由底层传输(gen_tcp 或 ssl)调用。
当我将客户端和服务器配置为使用gen_tcp
. 当我改为使用ssl
时,websocket 握手完成,但在第 4 步中,我得到一个回调handle_info
,它只包含从服务器返回的数据的第一个字节。随后的回调将包含响应的其余部分。
我真的对这种行为感到困惑,因为交换了 gen_tcp 的相同代码可以正常工作,而且我们还有另外两个使用ssl
(但不是 websockets 或牛仔)构建的传输,它们同样没有表现出这种行为。
谁能建议可能导致数据以这种方式拆分的原因?如果不需要,我宁愿不必为此编写处理程序。
更新:只是为了好玩,我修改了客户端,以便它等待两个回调发生,并在尝试解析之前连接来自这两个回调的数据。这解决了问题,但仍然让我感到困惑。
不过,我确实注意到了几件事:
- 第一组两个回调总是包含一个字节
- 该字节始终为 130 (0x82)
不知道这是否相关。