Objective-C WebSocket库,用于在iOS和OS X上构建实时交互的功能。
PSWebSocketDriver
,简化“自己带来网络IO”建议使用cocoapods进行安装。将pod 'PocketSocket'
添加到您的Podfile,并运行pod install
。
PSWebSocketDriver
- 无网络驱动,用于处理WebSocket协议。它仅通过解析原始字节为事件以及将事件作为原始字节发送来操作。PSWebSocket
- 基于NSInputStream和NSOutputStream的基于网络的socket,确保连接保持。内部使用PSWebSocketDriver
在输入和输出上。PSWebSocketServer
- 基于CFSocket的基于网络的socket服务器。对于每一个进入的请求,它创建一个PSWebSocket实例。客户端支持协议ws
和加密的wss
。它会自动为您从设备上的证书链中进行证书协商,并计划支持固定证书。
客户端将始终请求服务器通过permessage-deflate扩展打开压缩。如果服务器接受请求,则会在整个连接期间启用它,并在所有消息中使用它。
如果初始的NSURLRequest
指定了一个大于0的超时,则如果在那个时间段内无法打开连接,连接将超时,否则它可能根据系统可能永远等待。
#import <PSWebSocket/PSWebSocket.h>
@interface AppDelegate() <PSWebSocketDelegate>
@property (nonatomic, strong) PSWebSocket *socket;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
// create the NSURLRequest that will be sent as the handshake
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"wss://example.com"]];
// create the socket and assign delegate
self.socket = [PSWebSocket clientSocketWithRequest:request];
self.socket.delegate = self;
// open socket
[self.socket open];
return YES;
}
#pragma mark - PSWebSocketDelegate
- (void)webSocketDidOpen:(PSWebSocket *)webSocket {
NSLog(@"The websocket handshake completed and is now open!");
[webSocket send:@"Hello world!"];
}
- (void)webSocket:(PSWebSocket *)webSocket didReceiveMessage:(id)message {
NSLog(@"The websocket received a message: %@", message);
}
- (void)webSocket:(PSWebSocket *)webSocket didFailWithError:(NSError *)error {
NSLog(@"The websocket handshake/connection failed with an error: %@", error);
}
- (void)webSocket:(PSWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean {
NSLog(@"The websocket closed with code: %@, reason: %@, wasClean: %@", @(code), reason, (wasClean) ? @"YES" : @"NO");
}
@end
服务器目前仅支持 ws
协议。服务器会绑定指定的主机地址和端口,并接受入站连接。它解析每个连接中第一个 HTTP 请求,然后询问代理是否接受它并完成 WebSocket 握手。服务器期望始终保持它管理的所有 PSWebSocket
实例的代理,因此请小心不要自行管理它们或从服务器中移除。
#import <PSWebSocket/PSWebSocketServer.h>
@interface AppDelegate() <PSWebSocketServerDelegate>
@property (nonatomic, strong) PSWebSocketServer *server;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
_server = [PSWebSocketServer serverWithHost:nil port:9001];
_server.delegate = self;
[_server start];
}
#pragma mark - PSWebSocketServerDelegate
- (void)serverDidStart:(PSWebSocketServer *)server {
NSLog(@"Server did start…");
}
- (void)serverDidStop:(PSWebSocketServer *)server {
NSLog(@"Server did stop…");
}
- (BOOL)server:(PSWebSocketServer *)server acceptWebSocketWithRequest:(NSURLRequest *)request {
NSLog(@"Server should accept request: %@", request);
return YES;
}
- (void)server:(PSWebSocketServer *)server webSocket:(PSWebSocket *)webSocket didReceiveMessage:(id)message {
NSLog(@"Server websocket did receive message: %@", message);
}
- (void)server:(PSWebSocketServer *)server webSocketDidOpen:(PSWebSocket *)webSocket {
NSLog(@"Server websocket did open");
}
- (void)server:(PSWebSocketServer *)server webSocket:(PSWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean {
NSLog(@"Server websocket did close with code: %@, reason: %@, wasClean: %@", @(code), reason, @(wasClean));
}
- (void)server:(PSWebSocketServer *)server webSocket:(PSWebSocket *)webSocket didFailWithError:(NSError *)error {
NSLog(@"Server websocket did fail with error: %@", error);
}
@end
驱动是 PSWebSocket
的核心。它处理握手请求/响应的生命周期,将消息打包成 WebSocket 帧以发送,并解析通过线接收到的 WebSocket 帧。
它支持客户端和服务器模式,并为每种模式提供相同的 API。
要在客户端模式中创建其实例,您可以使用 clientDriverWithRequest:
或 serverDriverWithRequest:
。在客户端模式中,您需要传入一个将作为握手请求发送的 NSURLRequest
。在服务器模式中,您需要传入作为握手请求的 NSURLRequest
。
除此之外,请查看 PSWebSocketDriverDelegate
方法以及与驱动器交互的简单 API。
PSWebSocketServer
添加对 SSL 的支持sudo pip install autobahntestsuite
wstest -m fuzzingserver
目前,Objective-C 中用于 WebSocket 客户端的选择不多。尽管 SocketRocket 可能是最著名的,但其代码库完全包含在一个文件中,而且在构建新功能(如 permessage-deflate 和连接超时)时显得有些困难。
PocketSocket 首先旨在提供一个丰富且易于挖掘和修改的工具集,当需要时可以修改。网络层与驱动层之间的解耦使得将库与现有配置相结合具有很大的灵活性。
其次,我们打算让 PocketSocket 保持领先地位。一旦任何主要的 WebSocket 扩展开始实施,您就可以确信它们将随着草案的稳定而迅速融合。
最后,我们旨在创建从客户端到服务器的完整图片,所有这些都包含在一个单一但解耦的工具包中,以满足 iOS 和 OS X 上的各种用例。
版权 2014 Zwopple Limited
根据 Apache 许可证 2.0 版(“许可证”);除非您在使用时遵守此许可证,否则不得使用此文件。您可以在以下位置获取许可证副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”分发,不提供任何明示或暗示的保证或条件。有关许可证的具体语言,请参阅许可证。