2015-05-21 59 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