2015-05-21 53 views
0

当使用GCDAsyncSocket发送长文本字符串时,在接收端会调用readDataWithTimeOut多次,但收到的数据不一致,即收到相同的文本,但NSData不同。造成这种差异的可能原因是什么?请让我知道,因为我对GCDAsyncSocket知之甚少。使用替代GCDAsyncSocket部分读取长文本:iOS

- (void)writeData:(NSData *)data { 
    [self.asyncSocket writeData:data withTimeout:-1 tag:1]; 
} 

#pragma mark - GCDAsyncSocket Delegate Methods - 
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err { 
    [[NSNotificationCenter defaultCenter] postNotificationName:KSOCKET_MANAGER_REMOVAL 
                 object:self 
                 userInfo:nil]; 

} 

- (void)socketDidCloseReadStream:(GCDAsyncSocket *)sock { 

} 

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag { 

} 

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { 
    DDLogInfo(@"SOCKET DID READ DATA:%@:%@",self.asyncSocket,self.contactJID); 
    [sock readDataWithTimeout:-1 tag:0]; 
    if (data!=nil) 
     [self loadMessageWithData:data]; 
} 

#pragma mark - Private Methods - 
- (void)loadMessageWithData:(NSData *)encryptedData { 
NSLog(@"DATA RECEIVED"); 
} 

回答

2

socket.readDataToData(getNsData(), withTimeout: -1, tag: 1) 

socket.readDataWithTimeout(1, tag: 0) 

功能used-

private func getNsData()-> NSData{ 
     return NSData(bytes: "#####", length: 5) 
    } 

而且要求服务器在家伙要追加这个 “#####”响应结束

//本地套接字被连接到远程套接字

func socket(socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16) 

{ 

    println("Connected to \(host) on port \(p).") 

    socket.readDataToData(getNsData(), withTimeout: -1, tag: 2) 

} 

//Some message from remote socket 

func socket(socket : GCDAsyncSocket, didReadData data:NSData, withTag tag:UInt16) 

{ 

    var response = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 

    let stringLength = count(response) // Since swift1.2 `countElements` became `count` 

    let substringIndex = stringLength - count("#####") 

    var servResWithoutHash = response.substringToIndex(advance(response.startIndex, substringIndex)) 

    println("Updated response \(servResWithoutHash)") 



    if let action = getTheCommand(servResWithoutHash){ 

     println("COMMAND == \(action)") 

    socket.readDataToData(getNsData(), withTimeout: -1, tag: 2) 

} 

//Notifies when socket gets disconnected 

func socketDidDisconnect(sock: GCDAsyncSocket!, withError err: NSError!) { 

    println("Socket did disconnect with error \(err?.description)"); 
} 
+0

基本上,我使用XMPP框架内部使用GCDAsyncSocket类。我改变了你描述的方式。我遇到了两个问题:1。文本现在第二次被传送2.仍然接收到数据块而不是完整的数据。你能告诉我需要做什么吗?我也修改了我添加代码的问题。 –

+0

请检查更新的答案 – Pramod