定义异步函数参数时遇到麻烦

时间:2019-08-01 01:52:43

标签: python websocket

我正在设置一个python websocket客户端,该客户端应按照以下说明发送和接收请求:

  1. 连接到网络套接字。
  2. 发送请求以获取当前时间戳。
  3. 接收当前时间戳。
  4. 比较时间,如果时间同步,则继续,如果不答复(“ not_synced!”)。
  5. 发送计算机名称(在这种情况下,它是在配置文件中定义的)
  6. 服务器响应,并在以后的时间戳返回
  7. 期待ping操作,时间会保存在配置文件中
  8. 关闭连接并等待当前时间与将来的时间匹配!

到目前为止,我已经完美地创建了用于读取/保存配置文件中的字符串的功能,将接收到的时间与当前时间进行了比较。

我无法弄清楚如何解决它的唯一问题是与服务器的通信,实际上我想定义一个函数来完成所有通信。

在没有异步的情况下尝试定义函数,我无法返回收到的消息。 在使用asyncio时,我无法在函数中传递参数(实际上是消息字符串!)

import asyncio
import websockets


async def connect(msg):
    async with websockets.connect("ws://connect.websocket.in    /xnode?room_id=19210") as socket: # the opencfg function reads a file, in this case, line 4 of config file where url is stored
        await socket.send(msg)
    result =await socket.recv()
    return result
asyncio.get_event_loop().run_until_complete(connect())


def connect2(msg):
    soc= websockets.connect("ws://connect.websocket.in    /xnode?room_id=19210")
    soc.send(msg)
    result=soc.recv()
    return result

print(connect2("gettime"))

如果您尝试发送“ gettime”,则将收到当前时间戳,在发送“ | online”之后,您应收到一个等于当前时间戳+ 10的值。

您拥有websocketurl,因此请自己尝试。

1 个答案:

答案 0 :(得分:0)

我将您的代码更改为使用asynio.gather来获取返回值,并将"gettime"传递给函数:

import asyncio
import websockets

address = "ws://connect.websocket.in/xnode?room_id=19210"

async def connect(msg):
    async with websockets.connect(address) as socket:
        await socket.send(msg)
        result = await socket.recv()
    return result
result = asyncio.get_event_loop().run_until_complete(asyncio.gather(connect("gettime")))
print(result)

输出

['1564626191']

您可以通过将其放入函数定义中来重复使用代码:

def get_command(command):
    loop = asyncio.get_event_loop()
    result = loop.run_until_complete(asyncio.gather(connect(command)))
    return result

result = get_command("gettime")
print(result)