探索 WebSocket

Home

这篇博文是由 ChatGPT-4o 协助整理的。


介绍

大家好,我是李智维。作为CodeReview平台的创始人兼CTO,以及前LeanCloud工程师,我在WebSocket方面有丰富的经验,尤其是在IM SDK的开发过程中。

WebSocket的重要性

WebSocket是一种在单一TCP连接上提供全双工通信信道的协议。它被广泛应用于需要实时交互的现代应用中,如即时通讯、实时评论、多玩家游戏、协作编辑和实时股票价格。

WebSocket的现代应用

WebSocket广泛应用于以下领域:

WebSocket的演变

轮询: 客户端频繁请求服务器获取更新。 长轮询: 服务器保持请求打开,直到有新信息可用。 HTTP双向连接: 需要多个连接进行发送和接收,并且每个请求都包含HTTP头。 单一TCP连接(WebSocket): 克服了HTTP双向连接的局限性,提供了更高的实时能力和更低的延迟。

在iOS上实现WebSocket

流行的iOS WebSocket库:

使用SRWebSocket

  1. 初始化和连接:
    SRWebSocket *webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://echo.websocket.org"]]];
    webSocket.delegate = self;
    [webSocket open];
    
  2. 发送消息:
    [webSocket send:@"Hello, World!"];
    
  3. 接收消息: 实现SRWebSocketDelegate方法来处理传入的消息和事件。

  4. 错误处理和事件通知: 适当处理错误并通知用户连接问题。

详细的WebSocket协议解释

WebSocket运行在TCP之上,并引入了几个增强功能:

WebSocket协议核心

1. 握手: WebSocket握手使用HTTP升级机制:

2. 数据传输: WebSocket帧可以包含UTF-8文本、二进制数据和控制帧,如关闭、ping和pong。

3. 安全: 浏览器自动添加Origin头,这无法被其他客户端伪造。

WebSocket URI

WebSocket帧协议

帧结构:

遮罩键: 用于通过遮罩客户端的帧来防止中间人攻击。

关闭握手

关闭帧:

示例

示例1:单帧未遮罩文本消息

0x81 0x05 0x48 0x65 0x6c 0x6c 0x6f

包含“Hello”

示例2:单帧遮罩文本消息

0x81 0x85 0x37 0xfa 0x21 0x3d 0x7f 0x9f 0x4d 0x51 0x58

包含“Hello”,带遮罩键

示例3:分片未遮罩文本消息

0x01 0x03 0x48 0x65 0x6c
0x80 0x02 0x6c 0x6f

分片包含“Hel”和“lo”两帧

高级主题

遮罩和解遮罩:

分片:

控制帧:

扩展性

扩展数据可以放在消息体的应用数据前:

发送:

关闭握手:

关闭连接:

参考资料

致谢

感谢大家的关注。如果有更多问题或讨论,欢迎在GitHub或微博上与我交流。


Back Donate