0

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

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

2 回答 2

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)
于 2012-06-06T00:02:57.273 回答
0

流有点挂在我的代码上。

当然是这样,因为它是一个无限循环,除非socket.timeout发生其他异常。

也许这是 ruby​​ 代码的另一部分

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

于 2014-03-27T09:42:15.567 回答