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接收大的数据时就接收的不完整