Форум сайта python.su
да и вообще с сокетами
задачу я себе поставил следующим образом
есть пользователь с нтерфейсом управления
есть сервер шлюз-обработчик
есть сервер поставщик данных
на стороне пользователя есть веб страница с ява скриптом которая коннектиться к серверу и отправляет и принимает от него запросы в виде json пакетов.
на стороне сервера поставщика данных реализована потоковая отдача данных тоесть я отправляю на него запрос он мне отвечает потоком данных
мне необходимо написать websocket сервер который при установлении соединения с пользователем будет устанавливать соединение с сервером поставщиком данных. затем при получении запрос от пользователя обрабатывать его (добавлять данные и структурировать запрос) и отправлять серверу источнику данных.
При получении от последнего данных обрабатывать их и отправлять пользователю в виде тогоже потока данных.
на данный момент с помощью примеров я сделал сервер который работает с пользователем. Устанавливает соединение принемает запрос добавляет данные и отправляет назад
сделал клиент который коннектиться к серверу источнику данных отправляет запрос и начинает получать поток данных. теперь свтал вопрос как эти 2 процесса поженить между собой. Для реализации этой задачи я использовал библиотеку WebSockets 3.3
Офлайн
LigaСудя по описанию очень просто. Логику обработки запроса пользователя перенести в источник данных и шлюз обработчик выкинуть из архитектуры вашего приложения (из описания не ясно почему так делать плохо). Более того, если пользователеь шлет запрос, а сервер отвечает, то и вебсокеты вам не нужны, это обычная логика веб приложений. Выкинуть сокеты и оставить только http запросы.
теперь свтал вопрос как эти 2 процесса поженить между собой
Офлайн
doza_andтак дело в том что источник данных не мой это просто сервер с открытым сокетом который шлет данные
Офлайн
Ок понятно зачем вам шлюз.
Вам надо код привести, чтобы нам было понятно
ну например из документации:
#!/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()
Офлайн
doza_andну вот допустим унас из документации функция инициализации сервера
Ок понятно зачем вам шлюз.Вам надо код привести, чтобы нам было понятнону например из документации:
Отредактировано Liga (Июль 11, 2017 23:20:14)
Офлайн
Вот к примеру
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)
Офлайн
вообщем пока у меня получилось вот что
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()
но это не то что мне нужно
нужно отделить потоки друг от друга
посоветуйте как это сделать ?
Офлайн
Liga
вообщем пока у меня получилось вот что
[code python][/code]
Офлайн
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)
Офлайн
Вопрос снят. проблема решена собственными силами. Тему можно закрыть.
Офлайн