首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCDAsyncSocket -未接收数据- AsyncSocket工作正常

GCDAsyncSocket -未接收数据- AsyncSocket工作正常
EN

Stack Overflow用户
提问于 2011-07-01 21:17:43
回答 6查看 13.5K关注 0票数 7

我使用GCDAsyncSocket创建了一个连接到服务器的iPhone客户端。服务器在Windows服务器上运行.Net。连接很好,它也能很好地发送数据。

然后,我告诉客户端在发送之后直接进入接收...

代码语言:javascript
复制
[sock readDataToData:[GCDAsyncSocket LFData] withTimeout:15 tag:1]; 

我还将此设置为接收:

代码语言:javascript
复制
- (void)onSocket:(GCDAsyncSocket *)sock didReadData:(NSData *)data 
withTag:(long)tag 

还有:

代码语言:javascript
复制
   - (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag 

如果我等待超时,就会调用超时方法。

如果我从服务器发送数据,就不会调用超时,所以我假设客户端已经看到了一些东西,但在客户端上没有这方面的指示。

我还补充道:

代码语言:javascript
复制
- (void)socket:(GCDAsyncSocket *)sock didReadPartialDataOfLength: (NSUInteger)partialLength tag:(long)tag 

希望我能看到一个部分数据包,但这也不会被触发。

如上所述,如果我从服务器向客户端发送内容,则不会触发超时。然而,如果它还没有收到终结符,我会认为它也会超时。我也尝试过长度为3的阅读,但这并没有什么不同。

GCDAsyncSocket是问题所在。AsyncSocket似乎工作得很好。

也许是初始化错误?

dispatch_queue_t mainQueue = dispatch_get_main_queue();

asyncSocket = [GCDAsyncSocket alloc :自委托队列:主队列]

你知道我做错了什么吗?

我在眼镜代码上发布了一个帖子,但是没有任何活动,所以我不确定我是否会得到答案。

理想情况下,如果任何人有一个样例代码,接收工作,那将是伟大的!谢谢!

EN

回答 6

Stack Overflow用户

发布于 2011-12-02 20:14:00

可能是拼写有问题。(这件事发生在我身上,我花了几个小时寻找,直到我发现了其中的细微差别)

GCDAsyncSocket将所有委托回调从onSocket重命名为socket,以匹配苹果命名风格。

在上面的示例中,您提到了

代码语言:javascript
复制
- (void)onSocket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 

将其重命名为

代码语言:javascript
复制
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 

这应该可以解决这个问题。

在我的代码中,我也遇到了另一个问题。确保调用GCDAsyncSocket的对象在您连接时仍然是活动的。GCDAsyncSockets委托是对对象的弱引用。因为它是异步的,所以当套接字响应时,委托可以变为零(自动释放,或者实例是在已经离开的方法中创建的)。因此,它似乎没有被调用,但启动套接字的类已经从内存中释放。尤其是当你同时使用ARC和GCDAsyncSocket的时候,这种情况会发生。

希望这能有所帮助

票数 9
EN

Stack Overflow用户

发布于 2011-07-01 22:31:58

您确定您的服务器发送的数据仅以LineFeed而不是CRLF终止吗?或者您从服务器发回的数据没有以任何方式终止?readDataToData将等待,直到它遇到接收数据中的终止字符。

这是我用来连接的代码。我已经去掉了我认为不必要的东西--希望我没有去掉任何重要的东西。

初始化套接字

代码语言:javascript
复制
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

连接

代码语言:javascript
复制
[asyncSocket connectToAddress:addr error:&err]

在连接上

代码语言:javascript
复制
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {
    connected = YES;

发送(无超时)

代码语言:javascript
复制
[asyncSocket writeData:dataData withTimeout:-1 tag:0];

读取数据的请求

代码语言:javascript
复制
[asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:30.0 tag:0];

数据已经通过了(我只是在发送字符串)

代码语言:javascript
复制
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
票数 3
EN

Stack Overflow用户

发布于 2013-10-15 01:39:44

我也遇到了同样的问题,准备放弃。我的问题是服务器端。在我的委托方法onSocket:didAcceptNewSocket中:我在错误的套接字上调用了一个read。这就解决了这个问题。

代码语言:javascript
复制
-(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket
{
    NSLog(@"Connection Socket connected to ipad at %@",[newSocket connectedHost]);
    _ipadSocket = newSocket;
    [_ipadSocket setDelegate:self];

    //***This code was the faulty line. I was calling listen on sock not newSocket
    [_ipadSocket readDataToData:[AsyncSocket CRLFData] withTimeout:10 tag:0];
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6548458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档