2010-08-14 3 views
1

asyncore를 사용하여 "length : message"-type 프로토콜을 사용하여 원격 서버와 통신합니다. 누군가 소켓에서 정확한 바이트 양을 읽을 수있는 방법을 추천 할 수 있습니까? handle_read를 사용하여 내부 버퍼를 채우고 매번 함수를 호출하여 버퍼 크기를 확인하려고했으나 너무 추해 보였습니다 (버퍼가 길이를 읽는 데 충분한 지 확인하십시오. 버퍼 길이가 메시지 길이보다 큰지 확인하십시오. 메시지 등). 버퍼가 충분히 채워지고 값을 반환 할 때까지 sleep하는 "socket.read (bytes)"와 같은 것을 가질 수 있습니까?파이썬 asyncore로 소켓에서 고정 된 바이트 양을 읽음

답변

1

아니요. 잠자기는 비동기 IO의 모든 목적을 무효화합니다.

그러나 이것은 매우 간단합니다. twisted.

from twisted.protocols.basic import Int32StringReceiver 

class YourProtocol(Int32StringReceiver): 
    def connectionMade(self): 
     self.sendString('This string will automatically have its length ' 
      'prepended before it\'s sent over the wire!') 

    def stringReceived(self, string): 
     print ('Received %r, which came in with a prefixed length, but which ' 
      'has been stripped off for convenience.' % (string,)) 
+0

나는 뒤틀린 것을 피하기를 희망했지만, 이것은 아주 좋은 해결책처럼 보입니다. 그러나 동시에 약간 다른 형식의 메시지를 처리 ​​할 수있는 방법이 있습니까? 길이와 같은 것 : 메시지 : additional_data 추가 데이터는 고정 길이를 갖지만이 길이는 접두어 길이에 포함되지 않습니다. 예를 들어 "4 : test : fixed_length_string"은 특수 조건이 충족 될 때만 발생하지만이 additional_data에도 액세스해야합니다. – Riz

+0

그렇게하면 약간 더 복잡해 지지만 너무 끔찍하지는 않습니다. 개인적으로,'qbuf' 써드 파티 모듈을 사용하는 것이 좋습니다. 나는이를 위해 이것을 사용하는 방법의 예를 게시 할 것이다. – habnabit

관련 문제