【问题标题】:What Websocket library for a Node.js server works best with iOS clients?Node.js 服务器的哪个 Websocket 库最适合 iOS 客户端?
【发布时间】:2015-03-06 03:16:45
【问题描述】:

在 iOS 客户端上,我使用的是 Square 的 SocketRocket:https://github.com/square/SocketRocket

在我所见的任何地方,我都发现了基于从浏览器访问或在数据库中查询的 Web 应用程序的 Websocket 库的比较,但对于 iOS 智能手机应用程序的客户端还没有。

客户端将根据请求通过应用程序连接到远程服务器(即连接不是“始终在线”或通过移动浏览器或代理或 GameCenter 完成),并且一旦连接,就与其他客户端配对在两人“游戏”的情况下。在比赛结束之前,连接需要保持,并且服务器将负责计时每个用户的回合并从/向每个用户接收和发出命令,有点像回合制游戏,除了每个回合都有一个服务器管理时限。一场比赛结束后(一般为 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 客户端的稳定性/可扩展性/复杂性问题可能表现得最好还是接口最少? SocketRocket wiki 本身没有帮助,因为它使用基于 Python/Go 的服务器端测试。

编辑:可能有用的资源: http://www.teehanlax.com/blog/how-to-socket-io-swift/

唯一缺少的是对其他潜在 websocket API 的比较或讨论,而不仅仅是 Socket.IO。但这是一个开始,因为它似乎可以与最新的 iOS、SocketRocket 和 Socket.IO 版本一起使用。

【问题讨论】:

    标签: javascript ios node.js websocket server


    【解决方案1】:

    我喜欢 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
    

    源代码:http://nunoferro.pt/?p=22

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2016-05-21
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多