2012-06-03 3 views
0

Ruby에서 Python으로 변환하려고합니다. 루비 코드 : 나는 플러시 할 수있는 방법을 찾을 수 없습니다 socket.flushPython 소켓 시간 초과 및 플러시

여기

def read_byte 
    begin 
     Timeout.timeout(0.5) do 
      b = socket.read 1 
     end 
    rescue Timeout::Error => e 
     socket.write("\n") 
     socket.flush 
     retry 
    end 
end 

def socket 
    @socket ||= TCPSocket.open @host, @port 
rescue SocketError 
    # TODO: raise a specific error 
    raise "Unable to open connection to #{@host} with given parameters" 
end 

내 평균 문제입니다. 다른 어떤 방법으로이 작업을 수행 할 수 있습니까? 나는 이것을 썼다. 파이썬 코드 :

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((self.host, self.port)) 
s.settimeout(0.5) 
while True: 
    try: 
     print s.recv(1) 
    except socket.timeout: 
     s.sendall("\n") 
+1

소켓을 플러시하여 이미'sendall()'을하지 않으려면 어떻게 될까요? – kindall

+0

스트림이 내 코드에 다소 매달려 있습니다. 그것은 루비 코드와 함께 작동합니다. –

답변

0

나는 소켓을 세척하는 것은 차이를 만들 것이라는 점을 의심하지 않지만, 여기에 먼저 파일 - 류의 객체를 생성하여 소켓을 "플러시"할 수있는 방법이다.

def flush_socket(s): 
    f = s.makefile() 
    f.flush() 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((self.host, self.port)) 
s.settimeout(0.5) 
while True: 
    try: 
     print s.recv(1) 
    except socket.timeout: 
     s.sendall("\n") 
     flush_socket(s) 
+0

여전히 Ruby 코드와 동일한 기능을 제공하지 않습니다. 루비 코드의 다른 부분 일 수도 있습니다. –

0

스트림은 좀 내 코드에 걸려있다.

물론 socket.timeout 이외의 예외가 발생하지 않는 한 무한 루프이기 때문에 당연합니다.

은 어쩌면 read_byte 호출하여 파이썬 while True에 그 비교되는 루비 루프를 검사 ... 루비 코드 그것은해야합니다

의 또 다른 부분입니다.

+0

저는 2 년 전부터이 일을하지 않았습니다. 관심이 있으시면 업데이트 된 [Ruby code] (https://github.com/gareth/live_f1-core)와 제 [Python 코드] (https://github.com/dadoeyad/live-f1-core)를 볼 수 있습니다. py) –

+0

업데이트 된 Ruby 코드에서 * live_f1-core/lib/live_f1/source/live.rb *의 read_bytes num은 Python의 while True와 비교하여 무한히 많은 숫자와 비교되는 num 바이트 만 읽으려고합니다. – Armali