连接到NodeJS socket.io的iOS客户端导致遇到Stream端

时间:2013-06-04 13:08:30

标签: ios node.js socket.io socketrocket

我有一个NodeJS服务器,它使用socket.io并监听端口8000.代码是这样的:

var io = require("socket.io");
var socket = io.listen(8000);
...
socket.sockets.on("connection", function(client) {
    util.log("Client connects: " + client.id);
});  

我已经编写了一个可以连接到此服务器的Web客户端,它运行正常。所以服务器代码不是问题。问题在于我将要描述的iOS客户端。

iOS客户端使用SocketRocket并安装它,我使用Cocoapods并拥有一个包含以下内容的Podfile:

platform :ios
pod 'SocketRocket', '0.2.0'

在MyViewController.h中

#import <SocketRocket/SRWebSocket.h>

@interface MyViewController : UIViewController<SRWebSocketDelegate> 
    ...
    @property (strong, nonatomic) SRWebSocket *socket;
@end

在MyViewController.m

@synthesize socket = _socket;
...

- (void)viewDidLoad
{
    _socket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://127.0.0.1:8000"]]];
    _socket.delegate = self;

    [_socket open];

    NSLog(@"Connect");
}

- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message {
    NSLog(@"Error didReceiveMessage");
}

- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error {
    NSLog(@"Error connecting websocket");
}

- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean {
    NSLog(@"Error didCloseWithCode %d: %@", code, reason);
}

当iOS客户端运行时,会显示“连接”日志。但委托didCloseWithCode()也被调用。日志显示

Error didCloseWithCode 0: Stream end encountered

我花了很多时间试图弄明白,但现在是时候从专家那里得到一些帮助了。为什么我会遇到“Stream end”问题。 NodeJS服务器运行正常,因为我可以通过Web客户端连接到它。我在iOS客户端做错了什么?如何更正?

更新:在服务器上添加JavaScript代码以显示util.log()调用。当Web客户端连接时,控制台显示“客户端连接”...“消息。当iOS客户端尝试连接时,控制台上没有任何内容。

1 个答案:

答案 0 :(得分:3)

事实证明,socket.io有自己的身份验证协议,并且与开箱即用的SocketRocket不兼容。看到这个答案:

How to use SocketRocket with socket.io?

从那里的答案中,你可以看看socket.io-objc