带有eventlet的Python套接字,recv被阻塞而没有返回

时间:2016-06-03 13:45:22

标签: python sockets python-3.x

这是一个简单的端口转发代理,它侦听localhost,然后将所有连接转发给真实代理,并将收到的数据发回给用户。

接受连接并侦听的服务器:

class Server:
    def __init__(self):
        self.server = eventlet.listen(('127.0.0.1', 8080))
        self.chunk_size = 8192

    def forward_connection(self, fd):
        print('in fwd_conn')
        data = b''
        while True:
            print('reading data')
            x = fd.readline()
            if not x.strip():
                break
            data += x
        print('Got request:', data)
        client = Client('45.55.31.207', 8081, data) # Connecting to proxy
        buff = client.read_from_proxy()
        fd.write(buff)
        fd.flush()

    def serve_client(self):
        pool = eventlet.GreenPool()
        while True:
            try:
                new_sock, addr = self.server.accept()
                print('accepted:', addr)
                pool.spawn(self.forward_connection, new_sock.makefile('rbw'))
            except (SystemExit, KeyboardInterrupt):
                break

server = Server()
server.serve_client()

这部分代码连接到“真正的”代理,接收数据并将其发回。但正如read_from_proxy函数中所评论的那样,它没有收到任何数据:

class Client:
    ''' All connections from Server are forwarded to Client which then
    forwards it to the proxy '''
    def __init__(self, ip, port, request):
        self.sock = socket.socket()
        self.sock.connect((ip, port))
        print('in client')
        print('sent request:', request)
        self.request = request

    def read_from_proxy(self):
        self.sock.sendall(self.request)
        data = b''
        while True:
            print('reading data from proxy') # this executes
            x = self.sock.recv(8192) # but this doesn't, it gets blocked here
            print('got x:', x) 
            if not x.strip():
                break
            data += x
        print('read all data')
        return data

我哪里错了?

0 个答案:

没有答案