Слушайте веб-сокеты под управлением Raspbian из Windows - PullRequest
0 голосов
/ 22 октября 2018

Я создал веб-сокет, используя модули Python asyncio и websockets.Этот сервер работает правильно на той же машине.Это фактический код для сервера:

import sys
import os
import asyncio
import websockets

@asyncio.coroutine
def receive(websocket, path):
    data = yield from websocket.recv()
    print('< {}'.format(data))

    output = 'Sent data from server: {}'.format(data)

    yield from websocket.send(output)
    print('> {}'.format(output))


start_server = websockets.serve(receive, '127.0.0.1', 8765)

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

Он работает правильно, и соединение с клиентом, находящимся на том же компьютере, подключается к нему без каких-либо проблем.

Но когда я пытаюсьдля доступа к нему от клиента в сети LAN он генерирует ConnectionRefusedError.Это код клиента:

import asyncio
import websockets

@asyncio.coroutine
def hello():
    websocket = yield from websockets.connect(
        'ws://192.168.0.26:8765')

    try:
        name = input("What's your name? ")

        yield from websocket.send(name)
        print("> {}".format(name))

        greeting = yield from websocket.recv()
        print("< {}".format(greeting))

    finally:
        yield from websocket.close()

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

Я установил ufw на Raspbian, чтобы включить порт 8765 с помощью этой команды:

ufw allow 8765

Но это не работает.На компьютере с Windows команда

nmap -p 8765 192.168.0.26

генерирует такой результат:

PORT        STATE    SERVICE
8765/tcp    closed   ultraseek-http

И ... команда

ufw status

Может кто-нибудь дать некоторые предложениярешить эту проблему связи между клиентом и сервером.

1 Ответ

0 голосов
/ 22 октября 2018

Вот одна проблема:

start_server = websockets.serve(receive, '127.0.0.1', 8765)

Вы указали websockets listen только на 127.0.0.1, таким образом, вы можете принимать только соединения, исходящие с локального хоста, и только наустаревший IPv4.И локальные соединения IPv6 (по умолчанию), и все соединения от других компьютеров получат сообщение об ошибке отказа в установлении соединения.

Если вы хотите получать соединения извне локальной машины, вы должны установить для Host значение Noneили пустая строка.Это будет принимать подключения из любого места, как на IPv6, так и на IPv4, при условии соблюдения любых правил брандмауэра.

start_server = websockets.serve(receive, None, 8765)

Хост и порт передаются напрямую asyncio.create_server(), который документирует Хостas:

  • Если хост является строкой, сервер TCP привязан к одному сетевому интерфейсу, указанному хостом.
  • Если хост представляет собой последовательность строк, TCPСервер связан со всеми сетевыми интерфейсами, указанными в следующей последовательности.
  • Если host - пустая строка или None, предполагаются все интерфейсы и будет возвращен список из нескольких сокетов (скорее всего, один для IPv4, а другой дляIPv6).
...