【问题标题】:GCDAsyncSocket reading long text partially: iOSGCDAsyncSocket 部分读取长文本:iOS
【发布时间】:2015-05-21 11:32:17
【问题描述】:

当使用GCDAsyncSocket发送长文本字符串时,在接收端多次调用readDataWithTimeOut,但接收到的数据不一致,即接收到相同的文本但NSData不同。差异的可能原因是什么?请告诉我,因为我对GCDAsyncSocket知之甚少。

- (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");
}

【问题讨论】:

    标签: ios iphone gcdasyncsocket


    【解决方案1】:

    使用这个

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

    而不是

    socket.readDataWithTimeout(1, tag: 0)
    

    使用的功能-

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

    并要求服务器人员在响应末尾附加此“#####”

    //本地socket连接到远程socket

    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)");
    }
    

    【讨论】:

    • 基本上,我使用的是内部使用 GCDAsyncSocket 类的 XMPP 框架。我确实改变了你描述的方式。我遇到了两个问题:1。文本现在正在第二次传输 2. 仍然接收数据块而不是完整的数据。你能告诉我需要做什么吗?我还修改了我添加代码的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多