Rx на Websocket, а Tx на другой Websocket, в том же процессе - PullRequest
0 голосов
/ 06 апреля 2020

Среда: Python 3.6.3 на Windows 10.

               websocket on port 8765 
Process_A.py --------------------------> Process_B.py;

                websocket on port 5678 
Process_C.py --------------------------> Process_D.html;

Я могу успешно отправить из Process_A.py в Process_B.py; и из Process_ C .py в Process_D. html.

Когда я объединяю Process_B и Process_ C: Process_A.py -------> Process_B & C .py - ----> Process_D. html

Я получаю следующую ошибку: Но когда я пытаюсь связать два (средний раздел: WS_Echo_Server.py и WS_Server.py), я получаю следующую ошибку:

Запуск сервера веб-сокетов на локальном узле: 8765 Сервер receiveOfMessage: полученное сообщение :: 22 :: sendMessageToWebPage - отправка сообщения :: 22 :: 0 :: Ошибка в трассировке обработчика соединения (последний вызов последнего):
Файл "C: \ Program Files \ Python36 \ lib \ site-packages \ websockets \ server.py", строка 191, в обработчике ожидают self.ws_handler (self, path) Файл "index.py", строка 1089, в receiveOfMessage ожидают sendMessageToWebPage (msg) Файл "index.py", строка 1076, в sendMessageToWebPage asyn c с websockets.connect (uri_ws_address) как web_socket: файл "C: \ Program Files \ Python36 \ lib \ site -packages \ websockets \ client.py ", строка 517, в aenter retu rn await self Файл "C: \ Program Files \ Python36 \ lib \ site-packages \ websockets \ client.py", строка 535, в await_impl транспорт, протокол = ожидание файла self._create_connection () "C: \ Program Files \ Python36 \ lib \ asyncio \ base_events.py", строка 786, в create_connection ',' .join (str (ex c) для ex c в исключениях))) OSError: Многочисленные исключения: [Errno 10061] Ошибка вызова Connect (':: 1', 5678), [Errno 10061] Ошибка вызова Connect ('127.0.0.1', 5678)

Process_A. py :

#!/usr/bin/env python

import asyncio
import websockets
import datetime
import random
import os

async def hello(uri):
    async with websockets.connect(uri) as web_socket:
        now : str = datetime.datetime.utcnow().isoformat() + "Z"
        msg = now + " " + "Hello World."
        print(f"WS_Sender_Of_Stuff -- sending message::{msg}::")
        await web_socket.send(msg)
        await asyncio.sleep(random.random() * 10)

while True :
    try :
        asyncio.get_event_loop().run_until_complete(hello('ws://localhost:8765'))
    except KeyboardInterrupt :
        break
    except Exception as er :
        print(f"Received an Error: {str(er)}")

Process_B.py :

import asyncio
import websockets

async def echo(websocket, path):
    counter : int = 0
    async for message in websocket:
        print(f"Echo Server: Received Message::{message}::")
        msg = message + " :: " + str(counter)
        counter += 1
        await websocket.send(msg)

asyncio.get_event_loop().run_until_complete(
    websockets.serve(echo, 'localhost', 8765))
asyncio.get_event_loop().run_forever()

Process_ C .py :

import asyncio
import datetime
import random
import websockets

async def WS_MessageToSend(p_websocket, p_msg : str) :
    await p_websocket.send(p_msg)

async def time(p_websocket, path):
    while True:
        now = datetime.datetime.utcnow().isoformat() + "Z"
        await WS_MessageToSend(p_websocket, now)
        await asyncio.sleep(random.random() * 3)


def Server_Of_Stuff() :
    WS_Server_Port : int = 5678
    WS_Host_Address : str = "localhost"

    ws_sender_server = websockets.serve(time, WS_Host_Address, WS_Server_Port)

    event_loop = asyncio.get_event_loop()
    event_loop.run_until_complete(ws_sender_server)
    event_loop.run_forever()

Server_Of_Stuff()

Process_D. html:

<!DOCTYPE html>
<html>
    <head>
        <title>WebSocket demo</title>
    </head>
    <body>
        <script>
            var     messages = document.createElement('ul');
            var     ws = null;

            function selfStart() {

                startWS();

                ws.onopen = function() {
                    console.log("Connected");
                };
                ws.onmessage = function (event) {
                    var     messages = document.getElementsByTagName('ul')[0];
                    var     message = document.createElement('li');
                    var     content = document.createTextNode(event.data);
                    message.appendChild(content);
                    messages.appendChild(message);
                };
                ws.onclose = function() {
                    console.log("WS --- ON CLOSE ---");
                    ws = null;
                    var     set_timer_id = setInterval(function() {
                        console.log("**** Inside of setInterval function ****")
                        if (ws !== null && ws.readyState !== 3) {
                            clearInterval(set_timer_id); 
                            return;
                        }
                        try {
                            selfStart();
                        } catch (e) {
                            console.log("Exception from startWS:" + e)
                        }
                    }, 5000)
                };
                ws.onerror = function () {
                    console.log("WS --- ERROR");
                };
                console.log("End Of ws.onmessage");

                function startWS() {
                    if (ws === null) {
                        try {
                            ws = new WebSocket("ws://127.0.0.1:5678/");
                        }
                        catch (error_of) {
                            console.log("startWS got exception: " + error_of)
                        }
                    }
                }

            }

            document.body.appendChild(messages);
            selfStart();
        </script>
    </body>
</html>

Вот код для объединенного сервера / отправителя ( Process_B & C .py ) :

import asyncio
import websockets
from http.server import HTTPServer

async def sendMessageToWebPage(message : str) :
    print(f"sendMessageToWebPage -- sending message::{message}::")
    uri_ws_address = 'ws://localhost:5678'
    async with websockets.connect(uri_ws_address) as web_socket :
        await web_socket.send(message)

    web_socket : WebSocketClientProtocol = await websockets.client.connect('ws://localhost:5678')
    await web_socket.send(message)
    await web_socket.close()

async def receiveOfMessage(websocket, path) :
    counter : int = 0
    async for message in websocket :
        print(f"receiveOfMessage Server: Received Message::{message}::")
        msg = message + " :: " + str(counter)
        counter += 1
        await sendMessageToWebPage(msg)

def StartLoop() :
    HTTP_Server_Port : int = 8008
    HTTP_Host_Address : str = "localhost"

    WS_Server_Port : int = 8765
    WS_Host_Address : str = "localhost"
    ws_server = websockets.serve(receiveOfMessage, WS_Host_Address, WS_Server_Port)
    print(f"Starting Web Socket Server on {WS_Host_Address}:{WS_Server_Port}")

    ev_loop = asyncio.get_event_loop()
    ev_loop.run_until_complete(ws_server)
    ev_loop.run_forever()

if __name__ == '__main__' : 
    StartLoop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...