Node.js 服务器的哪个 Websocket 库最适合 iOS 客户端?
What Websocket library for a Node.js server works best with iOS clients?
在 iOS 客户端上,我使用 Square 的 SocketRocket:https://github.com/square/SocketRocket
我到处都看到了基于从浏览器访问或在数据库中查询的 Web 应用程序的 Websocket 库的比较,但对于 iOS 智能手机应用程序的客户端还没有发现。
客户端将根据请求通过应用程序连接到远程服务器(即连接不是 "always-on" 或通过移动浏览器或代理或 GameCenter 完成),并且一旦连接,就会与两人 "game" 情况下的其他客户端。在比赛结束之前,连接需要持续存在,服务器将负责为每个用户的回合计时并接收和发出命令 from/to 每个用户,有点像回合制游戏,除了每个回合都有一个服务器-管理时间限制。一场比赛结束后(通常为 15-20 分钟),如果用户不想与另一个随机对手进行另一场比赛,则连接将关闭并且用户注销;想要继续的用户将由托管服务器(运行 Node.js 和 Websocket 库)与另一个用户匹配。
我考虑过的一些选项包括
Socket.IO 1.0: http://socket.io/
袜子:https://github.com/sockjs
ws:https://github.com/einaros/ws
nodejs-websocket:https://www.npmjs.com/package/nodejs-websocket
但从 https://medium.com/@denizozger/finding-the-right-node-js-websocket-implementation-b63bfca0539 那里听说 Socket.IO 对于大量用户流量来说不是最佳选择(而且我预计在任何时候都会有超过 300 名用户请求匹配),而且 Sockjs 不会没有一些命令查询功能,但在智能手机或 iOS 设备(不是浏览器)的上下文中,在任何情况下都没有找到决定性的答案。
问题是 Node.js 服务器 Websocket 库可能发挥最好的作用或与运行 SocketRocket 的 iOS 客户端的 stability/scalability/complexity 关注最少的接口? SocketRocket wiki 本身没有帮助,因为它使用 Python/Go-based 服务器端测试。
编辑:可能有用的资源:
http://www.teehanlax.com/blog/how-to-socket-io-swift/
唯一缺少的是对其他潜在 websocket API 的比较或讨论,而不仅仅是 Socket.IO。但这是一个开始,因为它似乎正在使用最新的 iOS、SocketRocket 和 Socket.IO 版本。
我喜欢 Sockjs,因为它很简单。这是 SocketRocket 的实现 --> Sockjs 作为概念证明
需要:
-SocketRocket(将 libicucore.dylib、Security.framework 和 CFNetwork.framework 添加到您的项目中)
-Node.js
-Sockjs 服务器
服务器:
var http = require('http'),
sockjs = require('sockjs'),
sockserver = sockjs.createServer(),
connections = [];
sockserver.on('connection', function(conn) {
console.log('Connected');
connections.push(conn);
conn.on('data', function(message) {
console.log('Message: ' + message);
// send the message to all clients
for (var i=0; i < connections.length; ++i) {
connections[i].write(message);
}
//
});
conn.on('close', function() {
connections.splice(connections.indexOf(conn), 1); // remove the connection
console.log('Disconnected');
});
});
var server = http.createServer();
sockserver.installHandlers(server, {prefix:'/sockserver'});
server.listen(3000, '0.0.0.0'); // http://localhost:3000/sockserver/websocket
客户(ViewController.m):
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
{
SRWebSocket *myWebSocket;
__weak IBOutlet UILabel *connectionStatus;
__weak IBOutlet UITextView *myTextView;
}
- (void)viewDidLoad {
[super viewDidLoad];
connectionStatus.textColor = [UIColor redColor];
myWebSocket = [[SRWebSocket alloc] initWithURL:[[NSURL alloc] initWithString:@"http://localhost:3000/sockserver/websocket"]];
myWebSocket.delegate = self;
[myWebSocket open];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message{
myTextView.text = message;
NSLog(@"message: %@",message);
}
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean{
connectionStatus.text = @"Disconnected";
connectionStatus.textColor = [UIColor redColor];
}
- (void)webSocketDidOpen:(SRWebSocket *)webSocket{
connectionStatus.text = @"Connected";
connectionStatus.textColor = [UIColor greenColor];
}
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error{
}
@end
在 iOS 客户端上,我使用 Square 的 SocketRocket:https://github.com/square/SocketRocket
我到处都看到了基于从浏览器访问或在数据库中查询的 Web 应用程序的 Websocket 库的比较,但对于 iOS 智能手机应用程序的客户端还没有发现。
客户端将根据请求通过应用程序连接到远程服务器(即连接不是 "always-on" 或通过移动浏览器或代理或 GameCenter 完成),并且一旦连接,就会与两人 "game" 情况下的其他客户端。在比赛结束之前,连接需要持续存在,服务器将负责为每个用户的回合计时并接收和发出命令 from/to 每个用户,有点像回合制游戏,除了每个回合都有一个服务器-管理时间限制。一场比赛结束后(通常为 15-20 分钟),如果用户不想与另一个随机对手进行另一场比赛,则连接将关闭并且用户注销;想要继续的用户将由托管服务器(运行 Node.js 和 Websocket 库)与另一个用户匹配。
我考虑过的一些选项包括 Socket.IO 1.0: http://socket.io/ 袜子:https://github.com/sockjs ws:https://github.com/einaros/ws nodejs-websocket:https://www.npmjs.com/package/nodejs-websocket
但从 https://medium.com/@denizozger/finding-the-right-node-js-websocket-implementation-b63bfca0539 那里听说 Socket.IO 对于大量用户流量来说不是最佳选择(而且我预计在任何时候都会有超过 300 名用户请求匹配),而且 Sockjs 不会没有一些命令查询功能,但在智能手机或 iOS 设备(不是浏览器)的上下文中,在任何情况下都没有找到决定性的答案。
问题是 Node.js 服务器 Websocket 库可能发挥最好的作用或与运行 SocketRocket 的 iOS 客户端的 stability/scalability/complexity 关注最少的接口? SocketRocket wiki 本身没有帮助,因为它使用 Python/Go-based 服务器端测试。
编辑:可能有用的资源: http://www.teehanlax.com/blog/how-to-socket-io-swift/
唯一缺少的是对其他潜在 websocket API 的比较或讨论,而不仅仅是 Socket.IO。但这是一个开始,因为它似乎正在使用最新的 iOS、SocketRocket 和 Socket.IO 版本。
我喜欢 Sockjs,因为它很简单。这是 SocketRocket 的实现 --> Sockjs 作为概念证明
需要: -SocketRocket(将 libicucore.dylib、Security.framework 和 CFNetwork.framework 添加到您的项目中) -Node.js -Sockjs 服务器
服务器:
var http = require('http'),
sockjs = require('sockjs'),
sockserver = sockjs.createServer(),
connections = [];
sockserver.on('connection', function(conn) {
console.log('Connected');
connections.push(conn);
conn.on('data', function(message) {
console.log('Message: ' + message);
// send the message to all clients
for (var i=0; i < connections.length; ++i) {
connections[i].write(message);
}
//
});
conn.on('close', function() {
connections.splice(connections.indexOf(conn), 1); // remove the connection
console.log('Disconnected');
});
});
var server = http.createServer();
sockserver.installHandlers(server, {prefix:'/sockserver'});
server.listen(3000, '0.0.0.0'); // http://localhost:3000/sockserver/websocket
客户(ViewController.m):
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
{
SRWebSocket *myWebSocket;
__weak IBOutlet UILabel *connectionStatus;
__weak IBOutlet UITextView *myTextView;
}
- (void)viewDidLoad {
[super viewDidLoad];
connectionStatus.textColor = [UIColor redColor];
myWebSocket = [[SRWebSocket alloc] initWithURL:[[NSURL alloc] initWithString:@"http://localhost:3000/sockserver/websocket"]];
myWebSocket.delegate = self;
[myWebSocket open];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message{
myTextView.text = message;
NSLog(@"message: %@",message);
}
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean{
connectionStatus.text = @"Disconnected";
connectionStatus.textColor = [UIColor redColor];
}
- (void)webSocketDidOpen:(SRWebSocket *)webSocket{
connectionStatus.text = @"Connected";
connectionStatus.textColor = [UIColor greenColor];
}
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error{
}
@end