PocketSocket 1.0.1

PocketSocket 1.0.1

测试已测试
Lang语言 Obj-CObjective C
许可证 Apache 2
发布上次发布2016年4月

Robert Payne维护。



  • Robert Payne

Objective-C WebSocket库,用于在iOS和OS X上构建实时交互的功能。

特性

  • 完全遵循RFC6455 WebSocket协议
  • 支持通过permessage-deflate扩展进行WebSocket压缩
  • 通过所有~355个Autobahn 客户端测试 & 服务器测试,100%符合规范
  • 客户端 & 服务器模式(见以下说明)
  • 支持TLS/SSL
  • 异步IO
  • 独立的PSWebSocketDriver,简化“自己带来网络IO”

依赖项

  • CFNetworking.framework
  • Foundation.framework
  • Security.framework
  • libSystem.dylib
  • libz.dylib

安装

建议使用cocoapods进行安装。将pod 'PocketSocket'添加到您的Podfile,并运行pod install

主要组件

  • PSWebSocketDriver - 无网络驱动,用于处理WebSocket协议。它仅通过解析原始字节为事件以及将事件作为原始字节发送来操作。
  • PSWebSocket - 基于NSInputStream和NSOutputStream的基于网络的socket,确保连接保持。内部使用PSWebSocketDriver在输入和输出上。
  • PSWebSocketServer - 基于CFSocket的基于网络的socket服务器。对于每一个进入的请求,它创建一个PSWebSocket实例。

将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

通过PSWebSocketServer使用PSWebSocket

服务器目前仅支持 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

使用 PSWebSocketDriver

驱动是 PSWebSocket 的核心。它处理握手请求/响应的生命周期,将消息打包成 WebSocket 帧以发送,并解析通过线接收到的 WebSocket 帧。

它支持客户端和服务器模式,并为每种模式提供相同的 API。

要在客户端模式中创建其实例,您可以使用 clientDriverWithRequest:serverDriverWithRequest:。在客户端模式中,您需要传入一个将作为握手请求发送的 NSURLRequest。在服务器模式中,您需要传入作为握手请求的 NSURLRequest

除此之外,请查看 PSWebSocketDriverDelegate 方法以及与驱动器交互的简单 API。

路线图

  • 添加对固定 SSL 证书的支持
  • PSWebSocketServer 添加对 SSL 的支持
  • 示例,示例,示例!

运行测试

  1. 安装 автобahn测试套件 sudo pip install autobahntestsuite
  2. 启动 autobahn 测试服务器 wstest -m fuzzingserver
  3. 在 Xcode 中运行测试

为什么需要一个新库?

目前,Objective-C 中用于 WebSocket 客户端的选择不多。尽管 SocketRocket 可能是最著名的,但其代码库完全包含在一个文件中,而且在构建新功能(如 permessage-deflate 和连接超时)时显得有些困难。

PocketSocket 首先旨在提供一个丰富且易于挖掘和修改的工具集,当需要时可以修改。网络层与驱动层之间的解耦使得将库与现有配置相结合具有很大的灵活性。

其次,我们打算让 PocketSocket 保持领先地位。一旦任何主要的 WebSocket 扩展开始实施,您就可以确信它们将随着草案的稳定而迅速融合。

最后,我们旨在创建从客户端到服务器的完整图片,所有这些都包含在一个单一但解耦的工具包中,以满足 iOS 和 OS X 上的各种用例。

作者

  • Robert Payne

许可

版权 2014 Zwopple Limited

根据 Apache 许可证 2.0 版(“许可证”);除非您在使用时遵守此许可证,否则不得使用此文件。您可以在以下位置获取许可证副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”分发,不提供任何明示或暗示的保证或条件。有关许可证的具体语言,请参阅许可证。