iOS Client 连接到 NodeJS socket.io 导致 Stream end 遇到

Posted

技术标签:

【中文标题】iOS Client 连接到 NodeJS socket.io 导致 Stream end 遇到【英文标题】:iOS Client connecting to NodeJS socket.io results in Stream end encountered 【发布时间】:2013-05-30 21:37:14 【问题描述】:

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

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

我花了很多时间试图弄清楚,但现在是时候向专家寻求帮助了。为什么我会遇到“流结束”问题。 NodeJS 服务器运行良好,因为我可以使用 Web 客户端连接到它。我在 iOS 客户端上做错了什么,我该如何纠正?

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

【问题讨论】:

服务器端有日志告诉你服务器收到了来自iOS客户端的连接吗? @MattBridges:我更新了问题。当 webClient 连接时,控制台会记录一条消息。但不是当 iOS 客户端尝试连接时。 【参考方案1】:

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

How to use SocketRocket with socket.io?

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

【讨论】:

以上是关于iOS Client 连接到 NodeJS socket.io 导致 Stream end 遇到的主要内容,如果未能解决你的问题,请参考以下文章

节点 js - Socket.io-client 未连接到 socket.io 服务器

将 Nodejs Faye-Client 连接到 Rails Faye 服务器

我正在尝试通过 Clearone 使用 NodeJS node-telnet-client 连接到 Converge Pro 2,但我仍然无法连接

通过 PHP 连接到 socket.io(nodejs)

使用 socket.io-client.java 库连接到 socket.io 命名空间

Socket.io-client 未连接到 socket.io 服务器反应和节点(快递)