Asyncsocket iPhone 读取数据

Posted

技术标签:

【中文标题】Asyncsocket iPhone 读取数据【英文标题】:Asyncsocket iPhone read data 【发布时间】:2011-03-19 22:38:20 【问题描述】:

我正在尝试使用以下代码捕获来自 .NET 服务器的响应。

进行 telnet 测试有效(我得到了响应);但是,使用此代码,我没有得到响应。

-(IBAction)connectClicked:(id)sender 
    if (![socket connectToHost:@"192.168.100.192" onPort:1337 error:nil]) 
        NSLog(@"connection failed");
        


-(IBAction)fireClicked:(id)sender 
    NSString *welcomeMsg = @"GetId";
    NSData *welcomeData = [welcomeMsg dataUsingEncoding:NSUTF8StringEncoding];
    [socket writeData:welcomeData withTimeout:-1 tag:0];
    NSLog(@"message sent!");


- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString*)host port:(UInt16)port 
    NSLog(@"onSocket:%p didConnectToHost:%@ port:%hu", sock, host, port);
    [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0];


-(void) onSocket:(AsyncSocket *)sock didReadData:(NSData*)data withTag:(long)tag 
    NSLog(@"onSocket:%p didReadData:%i", tag);    
    [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0];


- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag 
    NSLog(@"onSocket:didWriteDataWithTag:%i", tag);    
    [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0];

我确实获得了与服务器的连接,并且我能够向服务器发送信息,但我没有得到回复。

这是我在日志中得到的;

2011-03-21 10:00:32.424 CtC[33521:207] onSocket:0x4c3ebc0 didConnectToHost:192.168.100.192 port:1337
2011-03-21 10:00:35.846 CtC[33521:207] message sent!

为什么我没有收到回复?

【问题讨论】:

【参考方案1】:

我也有同样的问题。我在写入数据时模拟了“输入”按钮,因为服务器不知道命令何时结束。

所以这一行

NSString *welcomeMsg = @"GetId"; 

应该变成

NSString *welcomeMsg = @"GetId\r\n";

现在可以了。

【讨论】:

@derk 尝试实现- (void)onSocket:(AsyncSocket *)sender willDisconnectWithError:(NSError *)error 我刚刚阅读了您对 andy 的评论。尝试将 [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0]; 更改为 [sock readDataWithTimeout:-1 tag:0]; 嗨 Suprie,我得到的错误是; Error 3 (Read operation timed out) 也许您将超时设置为低。我不知道发生了什么,但每次我将超时设置为 0 时都会引发这些错误。所以我总是使用 100 或 -1 来表示超时。 要知道,如果我的程序运行良好,我尝试连接到常见的本地服务器 - 例如 ftp - 并尝试从它们那里读取一些响应。如果它适用于 ftp,它应该适用于其他服务。【参考方案2】:

我不清楚会出现什么问题,因为代码 sn-p 是不够的。但这就是我要继续的方式:

    检查当您连接到主机时它不会引发错误 在您的 fireClicked 方法中确保正确启动套接字 可能会覆盖 didConnectToHost 方法并添加 NSLog 语句以查看是否已连接 在 didReadData 和 didWriteDataWithTag 中使用给定的套接字“sock”,而不是变量“socket” 告诉我们您获得了哪些日志记录语句 告诉我们您是如何创建套接字以及如何连接到主机的。

希望能有所帮助 - 安迪

【讨论】:

嗨,安迪!谢谢你的回答! - 我更新了我的问题......但它仍然不起作用......你能看看吗?谢谢! 正如 Suprie 所提到的,您必须确保服务器端知道您来电何时结束(Enter、CTRL-D 等)。否则 .Net 服务器可能只是坐在那里等待进一步的输入。 4.是我的问题的解决方案。监督。谢谢@Andy S.【参考方案3】:

WireShark 在这些情况下总是有用的。快速比较 telnet 和您的应用程序可能会发现差异。

尝试删除 didConnectToHost 中的“readDataWithTimeout”,因为无论如何您在写入后都会调用它。 我想知道您是否正在断开导致读取超时,即您的有线协议错误。 WireShark 应该能帮上忙。

【讨论】:

以上是关于Asyncsocket iPhone 读取数据的主要内容,如果未能解决你的问题,请参考以下文章

AsyncSocket 和通知 - 内存泄漏

AsyncSocket 延迟发送数据

AsyncSocket 连接仅适用于家庭网络

请教,郁闷死了AsyncSocket接收大的数据时就接收的不完整

GCDAsyncSocket - 不接收数据 - AsyncSocket 工作正常

无法使用GCDAsyncSocket从服务器读取数据