Уведомления

Группа в Telegram: @pythonsu

#1 Июль 8, 2017 16:34:02

Liga
Зарегистрирован: 2017-07-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с websocket

да и вообще с сокетами

задачу я себе поставил следующим образом

есть пользователь с нтерфейсом управления
есть сервер шлюз-обработчик
есть сервер поставщик данных

на стороне пользователя есть веб страница с ява скриптом которая коннектиться к серверу и отправляет и принимает от него запросы в виде json пакетов.

на стороне сервера поставщика данных реализована потоковая отдача данных тоесть я отправляю на него запрос он мне отвечает потоком данных

мне необходимо написать websocket сервер который при установлении соединения с пользователем будет устанавливать соединение с сервером поставщиком данных. затем при получении запрос от пользователя обрабатывать его (добавлять данные и структурировать запрос) и отправлять серверу источнику данных.
При получении от последнего данных обрабатывать их и отправлять пользователю в виде тогоже потока данных.

на данный момент с помощью примеров я сделал сервер который работает с пользователем. Устанавливает соединение принемает запрос добавляет данные и отправляет назад

сделал клиент который коннектиться к серверу источнику данных отправляет запрос и начинает получать поток данных. теперь свтал вопрос как эти 2 процесса поженить между собой. Для реализации этой задачи я использовал библиотеку WebSockets 3.3

Офлайн

#2 Июль 8, 2017 16:50:06

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Помогите разобраться с websocket

Liga
теперь свтал вопрос как эти 2 процесса поженить между собой
Судя по описанию очень просто. Логику обработки запроса пользователя перенести в источник данных и шлюз обработчик выкинуть из архитектуры вашего приложения (из описания не ясно почему так делать плохо). Более того, если пользователеь шлет запрос, а сервер отвечает, то и вебсокеты вам не нужны, это обычная логика веб приложений. Выкинуть сокеты и оставить только http запросы.



Офлайн

#3 Июль 8, 2017 17:03:43

Liga
Зарегистрирован: 2017-07-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с websocket

doza_and
так дело в том что источник данных не мой это просто сервер с открытым сокетом который шлет данные

Офлайн

#4 Июль 8, 2017 22:38:15

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Помогите разобраться с websocket

Ок понятно зачем вам шлюз.
Вам надо код привести, чтобы нам было понятно
ну например из документации:

 #!/usr/bin/env python
import asyncio
import websockets
async def hello(websocket, path):
    name = await websocket.recv() # Получили запрос от клиента.
 # вот сюда и вставляете асинхронное чтение из источника данных по запросу с вашей стороны
 # вот тут по получении данных их обрабатываете и шлете на страницу результат преобразования
    await websocket.send(greeting)
start_server = websockets.serve(hello, 'localhost', 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()



Офлайн

#5 Июль 11, 2017 23:15:02

Liga
Зарегистрирован: 2017-07-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с websocket

doza_and
Ок понятно зачем вам шлюз.Вам надо код привести, чтобы нам было понятнону например из документации:
ну вот допустим унас из документации функция инициализации сервера

import asyncio
import websockets

import asyncio
import websockets

async def hello(websocket, path):
name = await websocket.recv()
print(“< {}”.format(name))

greeting = “Hello {}!”.format(name)
await websocket.send(greeting)
print(“> {}”.format(greeting))

start_server = websockets.serve(hello, ‘localhost’, 8765)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()


и функция инициализации клиента

import asyncio
import websockets

async def hello():
async with websockets.connect('ws/удаленный_сервер:8765') as websocket:

name = input(“What's your name? ”)
await websocket.send(name)
print(“> {}”.format(name))

greeting = await websocket.recv()
print(“< {}”.format(greeting))

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


в первом случае мы запускаем функцию иницализации сервера которая ждет сообщения от клиента отправляет ответ и заканчивает свою работу. замен циклом asyncio.get_event_loop().run_forever() мы запускаем ее заново. Как я это понимаю
во втором случае мы запускаем клиента который отправляет запрос получает ответ и на этом завершает свою работу.

мне необходимо скажем так примитивно

Запустить сервер который ожидает соединения(клиент скрипт веббраузера)

Как только соединение установлено необходимо запустить функцию клиента которая соединиться с удаленным сервером.

Далее я отправляю запрос с веб браузера на сервер

Сервер его принемает добавляет нужную информацию передает его клиенту

Клиент отправляет запрос на удаленный сервер

Удаленный сервер в зависимости от запроса может отправить либо ответ либо поток данных.

Как только приходит ответ от удаленного сервера клиент отдает этот ответ на сеервер.

Сервер обрабатывает данный ответ добавляя необходимы данные и отправляет этот ответ на клиент веббраузер.

как только веб браузер рвет соединение сервер останавливает клиента и переходит в ожидание следующего соединения.

вообщем я не понимаю как этот обмен можно организовать.

Отредактировано Liga (Июль 11, 2017 23:20:14)

Офлайн

#6 Июль 12, 2017 00:24:07

Liga
Зарегистрирован: 2017-07-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с websocket

Вот к примеру

import asyncio
import websockets

async def hellos(websocket, path):
print (websocket.state_name)
if websocket.open:
print(“Соединение с браузером открыто”)
asyncio.get_event_loop().run_until_complete(hello())

async def hello():
async with websockets.connect('ws/localhost:5000') as websocket:
if websocket.open:
print(“соединение с удаленным сервером открыто”)

name = ‘{“history”:“times”,“req_id”:1}’
await websocket.send(name)
print(“> {}”.format(name))
#while True:
greeting = await websocket.recv()
print(“< {}”.format(greeting))


start_server = websockets.serve(hellos, ‘localhost’, 9000)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

при этом я получаю следующую ошибку но программа отрабатывает 1 цыкл

Error in connection handler
Traceback (most recent call last):
File “C:\Anaconda3\lib\site-packages\websockets\server.py”, line 99, in handler
yield from self.ws_handler(self, path)
File “CAnaconda3/TEST/NEW_TEST/server_primitiv.py”, line 11, in hellos
asyncio.get_event_loop().run_until_complete(hello())
File “C:\Anaconda3\lib\asyncio\base_events.py”, line 454, in run_until_complete
self.run_forever()
File “C:\Anaconda3\lib\asyncio\base_events.py”, line 408, in run_forever
raise RuntimeError('This event loop is already running')
RuntimeError: This event loop is already running
OPEN
Соединение с браузером открыто
соединение с удаленным сервером открыто
> {“history”:“times”,“req_id”:1}
< {“echo_req”:{“history”:“times”,“req_id”:1},“history”:{“times”:},“msg_type”:“history”,“req_id”:1}

Отредактировано Liga (Июль 12, 2017 00:37:05)

Офлайн

#7 Июль 18, 2017 22:24:58

Liga
Зарегистрирован: 2017-07-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с websocket

вообщем пока у меня получилось вот что

import asyncio
import websockets
import threading


async def hellos(websocket, path):
global serv_receved
global client_receved
async with websockets.connect('ws/localhost:8000') as websocket_c:
print(“Соединение”)

while True:
client_receved = await websocket_c.recv()
print(“< {}”.format(client_receved))

serv_receved = await websocket.recv()
print(“< {}”.format(serv_receved))
if client_receved != “”:
websocket.send(client_receved)
print(“> {}”.format(client_receved))
client_receved = “”
if serv_receved != “”:
websocket_c.send(serv_receved)
print(“> {}”.format(serv_receved))
serv_receved = “”







start_server = websockets.serve(hellos, ‘localhost’, 8001)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

но это не то что мне нужно
нужно отделить потоки друг от друга
посоветуйте как это сделать ?

Офлайн

#8 Июль 18, 2017 23:00:45

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Помогите разобраться с websocket

Liga
вообщем пока у меня получилось вот что

Если бы у вас еще получилось научиться код вставлять в теги, вам бы цены не было.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#9 Июль 18, 2017 23:43:02

Liga
Зарегистрирован: 2017-07-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с websocket

 import asyncio
import websockets
import threading
async def hellos(websocket, path):
    global serv_receved
    global client_receved
    async with websockets.connect('ws://localhost:8000') as websocket_c:
        print("Соединение")
        while True:
            client_receved = await websocket_c.recv()
            print("< " + client_receved)
            await websocket.send(client_receved)
            print("> " + client_receved)
            serv_receved = await websocket.recv()
            print("< " + serv_receved)
            await websocket_c.send(serv_receved)
            print("> " + serv_receved)
start_server = websockets.serve(hellos, 'localhost', 8001)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

так вроде бы лучше

Отредактировано Liga (Июль 18, 2017 23:43:38)

Офлайн

#10 Июль 20, 2017 01:01:43

Liga
Зарегистрирован: 2017-07-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться с websocket

Вопрос снят. проблема решена собственными силами. Тему можно закрыть.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version