Python套接字超时和刷新

时间:2012-06-03 23:55:43

标签: python ruby sockets tcp

我正在尝试将其从Ruby转换为Python。 Ruby代码:

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

我的平均问题在于

  

socket.flush

我找不到做冲洗的方法。还有什么方法可以做到这一点? 我写了这个。 Python代码:

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

2 个答案:

答案 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)

答案 1 :(得分:0)

  

我的代码就像流一样。

当然是,因为它是无限循环,除非出现socket.timeout以外的一些例外。

  

也许它是红宝石代码的另一部分

必须是......检查调用read_byte的Ruby循环,并将其与Python while True进行比较。