从Windows收听运行Raspbian的websocket

时间:2018-10-22 15:53:20

标签: python websocket raspbian python-asyncio

我已经使用Python的asynciowebsockets模块创建了一个网络套接字。该服务器可以在同一台计算机上正常工作。这是服务器的实际代码:

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())

我已在Raspbian上安装ufw,以使用以下命令启用端口8765:

ufw allow 8765

但是它不起作用。在Windows计算机上,命令

nmap -p 8765 192.168.0.26

生成此结果:

PORT        STATE    SERVICE
8765/tcp    closed   ultraseek-http

然后...命令

ufw status

有人可以提出一些建议来解决客户端与服务器之间的这种通信问题。

1 个答案:

答案 0 :(得分:1)

这是一个问题:

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

您已经告诉websockets仅在127.0.0.1上listen,因此您只能接收来自本地主机的连接,并且只能接收旧版IPv4的连接。 localhost IPv6连接(默认)和来自其他计算机的所有连接都将收到连接拒绝错误。

如果要从本地计算机外部接收连接,则应将Host设置为None或空字符串。这将接受来自IPv6和IPv4上任何位置的连接,当然要遵守任何防火墙规则。

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

主机和端口直接传递到asyncio.create_server(),该文件将Host记录为:

  
      
  • 如果host是字符串,则TCP服务器绑定到host指定的单个网络接口。
  •   
  • 如果host是字符串序列,则TCP服务器绑定到该序列指定的所有网络接口。
  •   
  • 如果host为空字符串或None,则假定所有接口都将返回多个套接字的列表(最有可能的一个用于IPv4,另一个用于IPv6)。
  •