【问题标题】:Asyncsocket iPhone read dataAsyncsocket iPhone 读取数据
【发布时间】: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!

为什么我没有收到回复?

【问题讨论】:

    标签: ios iphone asyncsocket


    【解决方案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 是不够的。但这就是我要继续的方式:

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

    希望能有所帮助 - 安迪

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多