SocketRocket
适用于 iOS、macOS 和 tvOS 的符合 WebSocket (RFC 6455) 的客户端库。
SocketRocket 的测试结果在这里。您可以在这里与现代浏览器的结果进行比较。
SocketRocket 目前符合 Autobahn 核心测试的所有 ~300 条模糊测试(除了两个 UTF-8 测试 6.4.2 和 6.4.4,它只是非严格测试)。
特性/设计
- 支持 TLS (wss),包括自签名证书。
- 性能看起来相当好。
- 支持 HTTP 代理。
- 支持 IPv4/IPv6。
- 支持 SSL 证书固定。
- 发送
ping
并可以处理pong
事件。 - 异步和非阻塞。大部分工作都在后台线程上完成。
- 支持 iOS、macOS、tvOS。
安装
有几种选择。选择一个,或者随便按你的想法做
将以下行添加到您的 Podfile 中
pod 'SocketRocket'
运行 pod install
,设置完成。
将以下行添加到您的 Cartfile 中
github "facebook/SocketRocket"
运行 carthage update
,现在您的 Carthage 文件夹中应该有最新版本的 SocketRocket
-
作为子项目使用 SocketRocket
您也可以将
SocketRocket
作为子项目包含在您的应用程序中,尽管我们不推荐这样做,因为这会显著增加您的索引时间。要这样做,只需将SocketRocket.xcodeproj
文件拖放到您的工作区中。
API
SRWebSocket
WebSocket。
注意
在 -(void)open
期间和它关闭、出错或失败时,SRWebSocket
将保留自身。这与 NSURLConnection
的行为类似(与 NSURLConnection
不同,SRWebSocket
不会保留代理)。
接口
@interface SRWebSocket : NSObject
// Make it with this
- (instancetype)initWithURLRequest:(NSURLRequest *)request;
// Set this before opening
@property (nonatomic, weak) id <SRWebSocketDelegate> delegate;
// Open with this
- (void)open;
// Close it with this
- (void)close;
// Send a Data
- (void)sendData:(nullable NSData *)data error:(NSError **)error;
// Send a UTF8 String
- (void)sendString:(NSString *)string error:(NSError **)error;
@end
SRWebSocketDelegate
您需要实现这一点
@protocol SRWebSocketDelegate <NSObject>
@optional
- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessageWithString:(NSString *)string;
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessageWithData:(NSData *)data;
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(nullable NSString *)reason wasClean:(BOOL)wasClean;
@end
测试
包括了Python测试环境的设置脚本。它包含vitualenv,因此所有依赖都在用户空间中安装。
要从命令行运行短测试,运行
make test
要运行所有测试,运行
make test_all
短测试不包括性能测试(实际的瓶颈是测试 harness,而不是 SocketRocket)。
第一次运行可能需要一些时间来安装依赖,之后将会很顺畅。
您还可以在 Xcode 中运行测试,它与上述方式相同,但更容易调试。
- 选择
SocketRocketTests
目标 - 确保运行目标为您的 Mac 或任何模拟器
- 运行测试动作(《⌘+U》)
TestChat 演示应用程序
SocketRocket 包含一个演示应用程序 TestChat,它将在端口号 9900 上与监听websocket进行“聊天”。
TestChat 服务器
服务器接收一条消息并将其广播到所有已连接的客户端。
虽然需要一些依赖项才能运行,但我们还想重用我们在运行测试时创建的虚拟环境。如果您尚未运行测试,请在 SocketRocket 根目录中输入以下命令:
make test
这将配置您的 virtualenv。
现在,在您的终端中
source .env/bin/activate
pip install git+https://github.com/tornadoweb/tornado.git
在同一个终端会话中,启动聊天室服务器
python TestChatServer/py/chatroom.py
还有一个 Go 实现版本(包括最新的每周版本),您可以在其中
cd TestChatServer/go
go run chatroom.go
聊天
现在,启动 TestChat.app(只需在 Xcode 项目中运行目标)。如果您已经启动了它,您可以按刷新按钮以重新连接。应该会在顶部显示“已连接!”
要与应用程序交谈,请打开浏览器到 http://localhost:9000 并开始聊天。
WebSocket 服务器实现建议
SocketRocket 与以下库一起使用:
- Tornado
- Go 的 WebSocket 包 或 Gorilla 的 版本。
- Autobahn(使用其模糊客户端)。
Tornado 的实现非常简单,工作得很好。(IPython notebook 也使用它)。配置处理程序和路由比在 Autobahn/twisted 中要容易得多。
贡献
我们很高兴您对SocketRocket感兴趣,并期待看到您的成果。在提交Pull Request之前,请阅读我们的贡献指南。