2013-04-13 54 views
1

我正在使用GCDAsyncSocket編寫一個RubyMotion應用程序,並且在讀取數據到特定術語(在本例中爲CRLF)時遇到不一致的結果。而不是總是讀直到包括下一個CRLF,它有時會讀取多個CRLF序列。這本身並不一定是個問題,我可以將字符串拆分並進行解析,但是它有時會在隨後的字符串中讀取一部分內容,因此似乎會出現一些數據丟失情況。這似乎只發生在快速收到數據時。這是一個輸出示例。我發送了字符串「你好,這是一個測試字符串。」從服務器到我的應用程序快速連續100次。正如你從我的代碼中可以看到的,我用\ r \ n分割字符串,給這個特定的讀取調用分配一個隨機數並打印出結果數組的每個部分(0,1,2等)。請記住,這種方法規定它應該讀取\ r \ n並且不需要拆分。AsyncSocket與讀取行爲不一致

ID 252 Part 0:你好,這是一個測試字符串。 ID 252第1部分:你好,這是一個測試字符串。 ID 252第2部分:你好,這是一個測試字符串。 ID 252第3部分:你好,這是一個測試字符串。 ID 252第4部分:你好,這是一個測試字符串。 ID 252第5部分:你好,這是一個測試字符串。 ID 252第6部分:你好,這是一個測試字符串。 ID 252第7部分:你好,這是一個測試字符串。 ID 252第8部分:你好,這是一個測試st ID 780第0部分:你好,這是一個測試字符串。 ID 419第0部分:你好,這是一個測試字符串。 ID 128第0部分:你好,這是一個測試字符串。 ID 638第0部分:你好,這是一個測試字符串。 ID 950 Part 0:你好,這是一個測試字符串。 ID 950第1部分:字符串。 ID 704第0部分:你好,這是一個測試字符串。

正如您在閱讀950中看到的那樣,肯定會發生一些損失。這是我的代碼的相關位。

def connect() 
    $term = AsyncSocket.CRLFData 
    clear_keybindings("") 
    @ts = AsyncSocket.alloc.initWithDelegate(self, delegateQueue:Dispatch::Queue.main) 
    @ts.connectToHost('...', onPort:4001, error:nil) 
end 

def onSocket(sock, didConnectToHost:host, port:port) 
    $connected = true 
    send_message('os ios') 
    read_line 
end 

def onSocket(sock, didReadData:data, withTag:tag) 
    read_line 
    line = NSString.stringWithUTF8String(data.bytes) 
    if !line 
     return 
    end 
    id = Random.rand(1000) 
    line.split("\r\n").each_with_index do |l, i| 
     puts "ID #{id} Part #{i}: #{l}" 
     parse(l) 
    end 
end 

def read_line 
    @ts.readDataToData($term, withTimeout:-1, tag:0) 
end 

當我寫這一點,我想知道,如果使用GCDAsyncSocket而不是可能會解決問題,但如果我改變它想: @ts = GCDAsyncSocket.alloc.initWithDelegate(個體經營,delegateQueue:調度::隊列。主) 然後它連接,但我的代理方法根本不工作,也沒有數據似乎發送。任何幫助,將不勝感激。

+0

你有沒有解決這個問題?我有類似的問題試圖使用AsyncSocket設置服務器。 – tsugua

回答

0

我會將您的read_line調用移到didReadData:withTag:委託方法的最後。如果您在短時間內收到大量數據,則可能在您的委託方法有機會完成處理其當前數據之前正在讀取新數據。