首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >收听从Windows运行Raspbian的websockets

收听从Windows运行Raspbian的websockets
EN

Stack Overflow用户
提问于 2018-10-22 15:53:20
回答 1查看 193关注 0票数 0

我使用Python的asynciowebsockets模块创建了一个websocket。此服务器在同一台计算机中正常工作。这是服务器的实际代码:

代码语言:javascript
复制
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()

它正常运行,来自同一台机器上的客户端的连接没有任何问题地连接到它。

但是当我试图从局域网上的客户端访问它时,它会生成一个ConnectionRefusedError。这是客户端代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
ufw allow 8765

但不起作用。在Windows机器上,命令

代码语言:javascript
复制
nmap -p 8765 192.168.0.26

生成此结果:

代码语言:javascript
复制
PORT        STATE    SERVICE
8765/tcp    closed   ultraseek-http

还有..。命令

代码语言:javascript
复制
ufw status

有人能给出一些建议来解决客户端和服务器之间的通信问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-22 16:06:48

这里有一个问题:

代码语言:javascript
复制
start_server = websockets.serve(receive, '127.0.0.1', 8765)

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

如果希望从本地机器外部接收连接,则应将Host设置为None或空字符串。这将接受来自任何地方的连接,无论是在IPv6还是IPv4上,当然都要遵守任何防火墙规则。

代码语言:javascript
复制
start_server = websockets.serve(receive, None, 8765)

主机和端口直接传递给asyncio.create_server(),后者将主机记录为:

  • 如果主机是字符串,则TCP服务器绑定到主机指定的单个网络接口。
  • 如果主机是字符串序列,则TCP服务器绑定到序列指定的所有网络接口。
  • 如果主机是空字符串或无,则假定所有接口,并将返回多个套接字的列表(最有可能是IPv4和IPv6的另一个套接字)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52933369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档