Как я могу получать новые ответы в Websocket? - PullRequest
0 голосов
/ 02 июля 2018

У меня есть клиентский модуль:

#!/usr/bin/env python

# WS client example

import asyncio
import websockets

async def hello():
    async with websockets.connect(
            'ws://A.B.C.D:8765') as websocket:
        name = input("What's your name? ")

        await websocket.send(name)
        greeting = await websocket.recv()
        print(greeting)

asyncio.get_event_loop().run_until_complete(hello())

и серверный модуль:

from __future__ import print_function
#!/usr/bin/env python
import asyncio
import datetime
import random
import websockets


import ast
from collections import defaultdict
import csv
import datetime
from itertools import chain
import json
import os
import operator
import sys
import pymongo
from pymongo import MongoClient

try:
    client = MongoClient('localhost', 27017)
    db = client["Bubble"]
except Exception as e:
    print(e)

start_match = datetime.datetime.strptime(
    "2018-07-01 18:00:00", '%Y-%m-%d %H:%M:%S')

collection = "CRODEN_R16"

async def hello(websocket, path):
    entity_name = await websocket.recv()
    print(entity_name)
    while True:
        file = open("set_start_match.txt", "r")
        for line in file:
            start_today = datetime.datetime.strptime(
                line.split('.')[0], '%Y-%m-%d %H:%M:%S')
        print(start_today)
        now = datetime.datetime.utcnow()
        diff = now - start_today
        request_match = start_match + diff
        print(diff)
        for post in db[collection].find():
            if "emotion" not in post.keys():
                print("Ignored")
                continue
            if post["timeStamp"] > request_match:
                if post["entity_name"] == entity_name:
                    print("Satisfied")
                    currDict = {}
                    currDict["entity"] = post["entity_name"]
                    currDict["emotion"] = max(
                        post["emotion"].items(), key=operator.itemgetter(1))[0]
                    currDict["profile_image"] = post["userProfile"]
                    currDict["tweet"] = post["tweet"]
                    currDict_json = json.dumps(currDict, default=str)
                    print(currDict["tweet"])
                    await websocket.send(currDict_json)
                    await asyncio.sleep(1)
                    del currDict

try:
    start_server = websockets.serve(hello, '0.0.0.0', 8765)
    print("Start entity server")
    asyncio.get_event_loop().run_until_complete(start_server)
    asyncio.get_event_loop().run_forever()
except Exception as e:
    print(e)

Теперь проблема в том, что я хочу отправить имя в качестве входных данных только один раз и непрерывно получать выходные данные. Когда я написал это в клиенте:

while True:
   greeting = await.websocket.recv()
   print(greeting)

Один и тот же ответ возвращается снова и снова. Даже на стороне сервера, где я печатаю результаты рендеринга из БД, я печатаю тот же самый документ.

Я совершенно не понимаю, в чем проблема?

Примечание. Я пытался запустить однократный клиентский модуль, и там я получал отличные результаты. Просто мне приходилось давать один и тот же вклад снова и снова. Я хочу, чтобы это было автоматизировано.

1 Ответ

0 голосов
/ 02 июля 2018

Для непрерывного получения данных кто-то должен непрерывно отправлять данные.

Если кто-то непрерывно отправляет данные, то кто-то другой должен постоянно получать данные.

Так что обеим сторонам нужна петля.

клиент - он посылает числа непрерывно в цикле.

#!/usr/bin/env python
import asyncio
import websockets
import time

async def hello():
    async with websockets.connect(
            'ws://localhost:8769') as websocket:

        name = input("What's your name? ")
        await websocket.send(name)

        i = 0
        while True:
            print('send:', i)

            await websocket.send(str(i))

            time.sleep(2)
            i += 1

try:
    asyncio.get_event_loop().run_until_complete(hello())
except KeyboardInterrupt:
    print('KeyboardInterrupt')

сервер - он непрерывно получает числа в цикле

import asyncio
import websockets


async def hello(websocket, path):
    entity_name = await websocket.recv()
    print('name:', entity_name)

    while True:

       data = await websocket.recv()

       print('recv:', data)


try:
    print("Start entity server")
    start_server = websockets.serve(hello, '0.0.0.0', 8769)
    asyncio.get_event_loop().run_until_complete(start_server)
    asyncio.get_event_loop().run_forever()
except KeyboardInterrupt: # keyboard need special except
    print("KeyboardInterrupt")
    start_server.ws_server.close() # solutin for [Errno 98]
except Exception as ex:
    print(ex)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...