2013-04-13 2 views
1

저는 GCDAsyncSocket을 사용하여 RubyMotion 응용 프로그램을 작성 중이며 특정 용어 (본인의 경우 CRLF)로 데이터를 읽을 때 일관성없는 결과가 발생합니다. 다음 CRLF까지 항상 읽는 것이 아니라 때때로 여러 개의 CRLF 시퀀스를 읽습니다. 이것은 반드시 그 자체로는 문제가되지 않을 것입니다. 단지 문자열을 분리하여 구문 분석 할 수는 있지만 이후의 문자열을 통해 일부분을 읽으므로 일부 데이터 손실이있는 것으로 보입니다. 이것은 데이터가 빠르게 수신 될 때만 발생하는 것으로 보입니다. 다음은 출력 샘플입니다. "Hello, this is a test string"이라는 문자열을 보냈습니다. 서버에서 내 앱으로 빠르게 연속해서 100 번. 아래의 코드에서 알 수 있듯이 문자열을 \ r \ n으로 나눠서 임의의 숫자를 해당 읽기 호출에 할당하고 결과 배열 (0, 1, 2 등)의 각 부분을 출력합니다. 이 방법은 \ r \ n까지 읽어야한다는 것을 명심해야하며 분할은 필요하지 않아야합니다.AsyncSocket으로 일관성없는 읽기 동작

ID 252 파트 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 : 안녕하세요, 테스트입니다. ID 780 파트 0 : 안녕하세요, 이것은 테스트 문자열입니다. ID 419 파트 0 : 안녕하세요, 테스트 문자열입니다. ID 128 파트 0 : 안녕하세요, 테스트 문자열입니다. ID 638 파트 0 : 안녕하세요, 테스트 문자열입니다. ID 950 파트 0 : 안녕하세요, 테스트 문자열입니다. ID 950 1 부 : 문자열. ID 704 파트 0 : 안녕하세요, 테스트 문자열입니다.

읽기 950에서 알 수 있듯이 확실히 약간의 손실이 발생합니다. 여기 내 코드의 관련 비트가 있습니다. 대신 GCDAsyncSocket를 사용하여 문제를 해결할 수있는 경우

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 

내가이 글을 쓰는되면서

, 나는 궁금하지만이 변경되면이 같은 : @ts = GCDAsyncSocket.alloc.initWithDelegate (자기, delegateQueue : 파견 :: 큐. main) 그때 그것은 연결되지만 내 대리자 메서드는 전혀 작동하지 않으며 데이터가 전송 된 것처럼 보입니다. 어떤 도움을 주시면 감사하겠습니다.

+0

이 문제를 해결 했습니까? AsyncSocket을 사용하여 서버를 설정하려고하는 것과 비슷한 문제가 있습니다. – tsugua

답변

0

read_line 호출을 didReadData:withTag: 대리자 메서드의 맨 끝으로 옮깁니다. 짧은 기간에 많은 양의 데이터를받는 경우 대리자 메서드가 현재 데이터 처리를 완료하기 전에 새 데이터를 읽을 수 있습니다.

관련 문제