3

我正在开发一个客户端-服务器应用程序,并负责添加对在 websockets 上运行的支持。我在服务器端使用 Cowboy,并且一直在使用 Erlang websocket 客户端进行测试。

事情应该是这样的:

  1. 客户端打开套接字连接并开始 http 握手
  2. 服务器完成http握手
  3. 客户端向服务器发送消息,服务器发送回复
  4. 客户端处理回复
  5. 重复 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)

不知道这是否相关。

4

1 回答 1

5

TCP 中没有消息边界。您没有任何权利依赖您所期望的行为。传输可以以它喜欢的任何部分为您提供数据,只要它以正确的顺序完整地提供所有数据。TCP 为您提供字节流,大多数 SSL 库也是如此(尽管在较低级别确实有 SSL 记录消息)。

于 2012-06-12T01:16:05.393 回答