我已经使用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())
我已在Raspbian上安装ufw
,以使用以下命令启用端口8765:
ufw allow 8765
但是它不起作用。在Windows计算机上,命令
nmap -p 8765 192.168.0.26
生成此结果:
PORT STATE SERVICE
8765/tcp closed ultraseek-http
然后...命令
ufw status
有人可以提出一些建议来解决客户端与服务器之间的这种通信问题。
答案 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)。