老师,请问open_connection是否可用于自定义socket协议的编程?

来源:13-6 asyncio 模拟 http 请求

宝慕林840146

2022-06-27

是这样的,我把本章节的代码在自己的环境中改了一下,但是实际运行的过程中,程序执行到async for那行就不再继续执行了,一直处于挂起状态。

import asyncio
import socket

async def login(info):

    #建立socket连接
    reader, writer = await asyncio.open_connection('10.20.xx.xx',11111)
    writer.write(bytes.fromhex(info))
    all_lines = []
    async for raw_line in reader:
        data = raw_line.decode("utf8")
        all_lines.append(data)
    recv_info = "".join(all_lines)
    return recv_info

if __name__ == "__main__":
    import time
    start_time = time.time()
    loop = asyncio.get_event_loop()
    tasks = []
    
    # 取10条做测试
    for i in range(10):
	    login_info = info[i]
	    tasks.append(login(login_info))
    loop.run_until_complete(asyncio.wait(tasks))
    print('last time:{}'.format(time.time()-start_time))

这个里面,main中的info是我自己获取的登录信息,为一个列表。发送的内容是自定义登录协议数据,我推断是reader没有从io流中读到数据,但是通过wireshark抓包能看到服务端是返回了数据的,请问这个您直到是怎么回事么?

写回答

1回答

bobby

2022-06-28

服务本身返回的数据要看是http数据还是tcp数据,如果是http数据的话,那么在客户端你就需要自己知道数据是否传输完成 你可以在async for里面每次获取到数据以后打印看看

0
4
bobby
回复
宝慕林840146
如果没有数据到来就会停住的
2022-10-08
共4条回复

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2121 学习 · 551 问题

查看课程