当前位置: 首页 > 知识库问答 >
问题:

在Python 3.6上侦听websocket客户端中的传入消息

夏高朗
2023-03-14
import websockets

class WebSocketClient():

    def __init__(self):
        pass

    async def connect(self):
        '''
            Connecting to webSocket server

            websockets.client.connect returns a WebSocketClientProtocol, which is used to send and receive messages
        '''
        self.connection = await websockets.client.connect('ws://127.0.0.1:8765')
        if self.connection.open:
            print('Connection stablished. Client correcly connected')
            # Send greeting
            await self.sendMessage('Hey server, this is webSocket client')
            # Enable listener
            await self.receiveMessage()


    async def sendMessage(self, message):
        '''
            Sending message to webSocket server
        '''
        await self.connection.send(message)

    async def receiveMessage(self):
        '''
            Receiving all server messages and handling them
        '''
        while True:
            message = await self.connection.recv()
            print('Received message from server: ' + str(message))
'''
    Main file
'''

import asyncio
from webSocketClient import WebSocketClient

if __name__ == '__main__':
    # Creating client object
    client = WebSocketClient()
    loop = asyncio.get_event_loop()
    loop.run_until_complete(client.connect())
    loop.run_forever()
    loop.close()

客户端正确连接到服务器,并发送问候语。但是,当客户端接收到这两条消息时,它会引发一个代码为1000的ConnectionClosed异常(没有原因)。

如果我移除receiveMessage客户端方法中的循环,client不会引发任何异常,但它只接收一条消息,所以我想我需要一个循环来保持listener活动,但我不知道具体在哪里或如何运行。

有解决办法吗?

共有1个答案

郑嘉悦
2023-03-14

最后,基于这个帖子回答,我修改了我的客户端和主文件如下:

WebSocket客户端:

import websockets
import asyncio

class WebSocketClient():

    def __init__(self):
        pass

    async def connect(self):
        '''
            Connecting to webSocket server

            websockets.client.connect returns a WebSocketClientProtocol, which is used to send and receive messages
        '''
        self.connection = await websockets.client.connect('ws://127.0.0.1:8765')
        if self.connection.open:
            print('Connection stablished. Client correcly connected')
            # Send greeting
            await self.sendMessage('Hey server, this is webSocket client')
            return self.connection


    async def sendMessage(self, message):
        '''
            Sending message to webSocket server
        '''
        await self.connection.send(message)

    async def receiveMessage(self, connection):
        '''
            Receiving all server messages and handling them
        '''
        while True:
            try:
                message = await connection.recv()
                print('Received message from server: ' + str(message))
            except websockets.exceptions.ConnectionClosed:
                print('Connection with server closed')
                break

    async def heartbeat(self, connection):
        '''
        Sending heartbeat to server every 5 seconds
        Ping - pong messages to verify connection is alive
        '''
        while True:
            try:
                await connection.send('ping')
                await asyncio.sleep(5)
            except websockets.exceptions.ConnectionClosed:
                print('Connection with server closed')
                break

主:

import asyncio
from webSocketClient import WebSocketClient

if __name__ == '__main__':
    # Creating client object
    client = WebSocketClient()
    loop = asyncio.get_event_loop()
    # Start connection and get client connection protocol
    connection = loop.run_until_complete(client.connect())
    # Start listener and heartbeat 
    tasks = [
        asyncio.ensure_future(client.heartbeat(connection)),
        asyncio.ensure_future(client.receiveMessage(connection)),
    ]

    loop.run_until_complete(asyncio.wait(tasks))
 类似资料:
  • 基本上,我希望监听我的rest api调用。就像有人向我的rest API发送数据一样。(例如:http://localhost:8080/api/people),然后websocket客户机侦听并可以从该地址获得响应,如果有人调用该地址。(就像使用postman从rest api获得响应一样,websocet客户机可以监听响应。)。我有点迷路了,我不知道如何用websocket客户端监听我的re

  • 问题内容: 我有一个PyQt Gui应用程序。此应用程序有一个主窗口,应在启动后打开。 此应用程序应监听websocket。 我试着解决它是这样的: 但是,启动应用程序后,主窗口没有打开。 如果没有“ ws.run_forever()”行,则打开主窗口,但应用程序不侦听websocket。 我需要在“背景”中收听网络套接字吗?你能帮助我吗? PS :(对不起,我的英语) 问题答案: 感谢engin

  • 我正在开发一个基于通知的应用程序,为此我需要监听传入的通知。我已经能够监听来电、短信、邮件等。我不知道如何通过代码监听Whatsapp上朋友的ping或消息。这实际上能做到吗?如果是,怎么做?可访问性服务是否可以用于此,使用包名为“com.whatsapp”?

  • 问题内容: 我有一个app.js,用于在接收到一些POST数据时触发两个事件: 将POST数据插入数据库 使用WebSocket向客户端发送消息 这是 app.js (仅重要的 几 行) 这是 server.js (仅重要的 几 行) 我想要实现的是以侦听应用程序相同端口的方式设置WebSocketServer。我考虑过将 服务器 var从 app.js 传递到 server.js, 但是 我认为

  • 客户端路由-从(“websocket://localhost:9999/camel/chat“”) 其中websocket server应用程序的jetty server正在9999上运行。。当尝试通过jetty websocket客户端应用程序进行连接时,它会在上述路由中的同一端口上启动另一个jetty,并给出已在使用的地址异常。。如何通过camel客户端建立连接。。

  • 将运行在JDK6-8下的现有web套接字客户端部署到Android(API 19)会使客户端无法将web套接字帧发送到服务器。 发生正常的http升级,并且存在http连接,但使用ChannelHandlerContext发送的任何消息都不存在。writeAndFlush()永远不要越界(我已经在服务器上与Wireshark确认了这一点)。 //从IClientConnection的实现 publ