Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 令人困惑的问题,asyncio与循环中的循环_Python_Sockets_Asynchronous_Python Asyncio - Fatal编程技术网

Python 令人困惑的问题,asyncio与循环中的循环

Python 令人困惑的问题,asyncio与循环中的循环,python,sockets,asynchronous,python-asyncio,Python,Sockets,Asynchronous,Python Asyncio,我正在尝试开发一种“反向代理”类型的东西,我几乎完成了。然而,我遇到了一个问题。我有两台服务器。运行实际源的主服务器(服务器A)和客户端将连接到的代理服务器(服务器B) 基本上,我的设计如下: 客户端连接到服务器B(代理服务器)后 客户端开始向服务器B发送数据包 服务器B将其数据包发送到服务器A 服务器A接收他们的数据包,对其进行适当的解析(这是实际的源),然后将响应数据包发送回服务器B 服务器B从服务器A接收数据包响应,并将其发送回客户端 到目前为止,它运行良好。然而,有一个主要问题。异步循环

我正在尝试开发一种“反向代理”类型的东西,我几乎完成了。然而,我遇到了一个问题。我有两台服务器。运行实际源的主服务器(服务器A)和客户端将连接到的代理服务器(服务器B)

基本上,我的设计如下:

客户端连接到服务器B(代理服务器)后

  • 客户端开始向服务器B发送数据包

  • 服务器B将其数据包发送到服务器A

  • 服务器A接收他们的数据包,对其进行适当的解析(这是实际的源),然后将响应数据包发送回服务器B

  • 服务器B从服务器A接收数据包响应,并将其发送回客户端

  • 到目前为止,它运行良好。然而,有一个主要问题。异步循环每个客户端数据包只能从服务器A(源服务器)接收一个数据包。因此,如果服务器B向服务器A发送一个数据包,服务器B将只能从服务器A接收一个响应数据包,即使服务器A想要用多个数据包进行响应。我相信read函数是阻塞的

    我有一些档案。我正在运行此循环中的所有内容:

    导入异步IO
    asyncio.run(server.loop())
    
    然后这就是实际的循环(这是一个较长的文件,但我删除了冗余信息):

    async def循环(self):
    self.server=wait asyncio.start_server(self.init,self.settings['proxy']['host'],self.settings['proxy']['ports']][self.type])
    与self.server异步:
    打印(“~Listening@{%s:%s}”%(self.settings['proxy']['host'],str(self.settings['proxy']['ports'][self.type]))
    打印()
    等待self.server.start_服务()
    等待自我。服务器。永远为你服务()
    异步定义初始化(self、r、w):
    等待客户端(self、r、w).connect()
    
    正如您所看到的,它调用一个客户机类,该客户机类包含实际代理文件的循环。它从客户端接收数据包,将其发送到服务器A,接收服务器A的响应,然后将其发送回客户端。这是客户端类(已删除冗余信息)

    异步def连接(自): self.ip=self.w.get_extra_info('peername')) self.tag=(“[%s:%s]”%(self.ip[0],str(self.ip[1])) self.dest['r'],self.dest['w']=等待异步IO.open_连接(host=self.host,port=self.port) 打印(“新客户端::%s”%(self.tag)) 而(不是self.w.正在关闭()): 尝试: 数据=等待self.r.readuntil(分隔符=b'\x00') 如果数据: 等待自我转发(数据) 其他: 等待self.disconnect() 除asyncio.UncompleteReadError外: 等待self.disconnect() 异步def转发(自身、数据): #数据=数据。解码(“utf-8”)[:-1] 打印(“RECV_DEST::%s=>%s”%(self.tag,data.decode(“utf-8”)[:-1])) 如果数据: self.w.write(数据) 异步def断开连接(自): 打印(“[断开客户端]:%s:%s”%(self.ip[0],str(self.ip[1])) self.w.close() 到目前为止,一切正常。客户端将数据包发送到此代理文件(服务器B),数据包发送到主源(服务器a),主源将数据包发送回代理文件(服务器B),然后服务器B将服务器a的响应发送回客户端。它是一个有效的代理脚本

    问题:使用此反向代理,我一次只能从主服务器a接收一行。因此,基本上,如果客户端发送服务器B 1数据包,则此远程代理仅从服务器a读取1个响应数据包,即使服务器a发回多个响应数据包。所以基本上,我一次只能读取一行,在
    forward()
    函数中


    我真的不知道该怎么做,除了在阅读过程中做另一个循环?我不知道我该怎么做。也许可以使用
    run\u-in\u-executor

    只是一个提示:您几乎肯定不需要另一个循环,也不需要
    run\u-in\u-executor
    。您可能需要
    asyncio.create_task()
    来创建多个并行工作的协同程序。只是一个提示:您几乎肯定不需要另一个循环,也不需要
    run_in_executor
    。您可能需要
    asyncio.create_task()
    来创建多个并行工作的协同程序。