简体   繁体   English

Pyro4 [Errno -2]

[英]Pyro4 [Errno -2]

I am trying out pyro4 connection between my PC and Raspberry Pi 4.我正在尝试我的 PC 和 Raspberry Pi 4 之间的 pyro4 连接。
Code on my PC is:我电脑上的代码是:

# saved as server.py
import Pyro4, Pyro4.naming
import socket, threading

# Define an object that will be accessible over the network.
# This is where all your code should go...
@Pyro4.expose
class MessageServer(object):
    def show_message(self, msg):
        print("Message received: {}".format(msg))


# Start a Pyro nameserver and daemon (server process) that are accessible
# over the network. This has security risks; see
# https://pyro4.readthedocs.io/en/stable/security.html
hostname = socket.gethostname()
ns_thread = threading.Thread(
    target=Pyro4.naming.startNSloop, kwargs={'host': hostname}
)
ns_thread.daemon = True   # automatically exit when main program finishes
ns_thread.start()
main_daemon = Pyro4.Daemon(host=hostname)

# find the name server
ns = Pyro4.locateNS()
# register the message server as a Pyro object
main_daemon_uri = main_daemon.register(MessageServer)
# register a name for the object in the name server
ns.register("example.message", main_daemon_uri)

# start the event loop of the main_daemon to wait for calls
print("Message server ready.")
main_daemon.requestLoop()

And code on my Raspberry is:我的树莓派上的代码是:

import Pyro4
import sys

print("Message:")
msg=sys.stdin.readline().strip()

message_server = Pyro4.Proxy("PYRONAME:192.168.1.5")
message_server.show_message(msg)

Code on my PC doesn t show any errors, but when I try to send a message from raspberry i get this:我电脑上的代码没有显示任何错误,但是当我尝试从树莓派发送消息时,我得到了这个:

What s your message?
test
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/socketutil.py", line 102, in getIpAddress
    return getaddr(config.PREFER_IP_VERSION) if ipVersion is None else getaddr(ipVersion)
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/socketutil.py", line 94, in getaddr
    ip = socket.getaddrinfo(hostname or socket.gethostname(), 80, family, socket.SOCK_STREAM, socket.SOL_TCP)[0][4][0]
  File "/usr/lib/python3.7/socket.py", line 748, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/core.py", line 515, in connect_and_handshake
    sslContext=sslContext)
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/socketutil.py", line 266, in createSocket
    if getIpVersion(connect[0]) == 4:
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/socketutil.py", line 68, in getIpVersion
    address = getIpAddress(hostnameOrAddress)
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/socketutil.py", line 106, in getIpAddress
    return getaddr(0)
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/socketutil.py", line 94, in getaddr
    ip = socket.getaddrinfo(hostname or socket.gethostname(), 80, family, socket.SOCK_STREAM, socket.SOL_TCP)[0][4][0]
  File "/usr/lib/python3.7/socket.py", line 748, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/pi/Desktop/client.py", line 10, in <module>
    message_server.show_message(msg)
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/core.py", line 275, in __getattr__
    self._pyroGetMetadata()
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/core.py", line 615, in _pyroGetMetadata
    self.__pyroCreateConnection()
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/core.py", line 588, in __pyroCreateConnection
    uri = _resolve(self._pyroUri, self._pyroHmacKey)
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/core.py", line 1915, in _resolve
    return nameserver.lookup(uri.object)
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/core.py", line 275, in __getattr__
    self._pyroGetMetadata()
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/core.py", line 615, in _pyroGetMetadata
    self.__pyroCreateConnection()
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/core.py", line 596, in __pyroCreateConnection
    connect_and_handshake(conn)
  File "/home/pi/.local/lib/python3.7/site-packages/Pyro4/core.py", line 549, in connect_and_handshake
    raise ce
Pyro4.errors.CommunicationError: cannot connect to ('JAKOB-PC', 9090): [Errno -2] Name or service not known

My PC has its firewall disabled, so there shouldn t be any problem with that.我的 PC 已禁用防火墙,因此应该没有任何问题。 My local ip is 192.168.1.5.我本地的ip是192.168.1.5。 I am using a headless Raspberry and write code on it with puTTY and VNC.我正在使用无头树莓派,并使用 PuTTY 和 VNC 在其上编写代码。

I have googled this error but couldn t find any answers.我用谷歌搜索了这个错误,但找不到任何答案。 Any help would be appreciated.任何帮助,将不胜感激。

I did this我做了这个

#
# Server.py
#
from __future__ import print_function
import Pyro4


@Pyro4.expose
@Pyro4.behavior(instance_mode="single")
class Messenger(object):
    # This is a constructor
    def __init__(self):
        pass

    # This method will be called on the server
    def send_message(self, name, message):
        print("[{0}] {1}".format(name, message))


def main():
    Pyro4.Daemon.serveSimple(
        {
            Messenger: "example.messenger"
        },
        ns=True)


if __name__ == "__main__":
    main()
#
# Client.py
#

# This is the code that visits the warehouse.
import sys

import Pyro4
import Pyro4.util


sys.excepthook = Pyro4.util.excepthook

messenger = Pyro4.Proxy("PYRONAME:example.messenger@192.168.1.5")
messenger.send_message("Tim", "Hello!")

Then ran然后跑

  • python -m Pyro4.naming -n 192.168.1.5
  • python Server.py
  • python Client.py

In short I couldn't solve the problem with Pyro and (almost) no one helped so I decided to use 'websockets' instead.简而言之,我无法用 Pyro 解决问题,而且(几乎)没有人提供帮助,所以我决定改用“websockets”。

You can read the documentation here but I'll explain it here anyway.您可以在此处阅读文档,但无论如何我都会在这里进行解释。

First of all you need two devices with.network connection.首先,您需要两台具有网络连接的设备。 You also have to run python 3.6.1 on both of them.您还必须在两者上运行 python 3.6.1。 After that you also need to install websockets if you don't have them already with pip install websockets or as I had to do it with pip3 install websockets .之后,如果您还没有使用pip install websockets或我必须使用pip3 install websockets install websockets 安装 websockets,则还需要安装它们。

Code below runs on the server and handles messages you send to it from client.下面的代码在服务器上运行并处理您从客户端发送给它的消息。 Function 'hello' is a simple example of processing request and sending back a response. Function 'hello' 是处理请求并发回响应的简单示例。 'request' is the data server receives, that data must be bytes, string on iterable. 'request'是服务器接收到的数据,数据必须是字节,可迭代的字符串。 Response is made by converting request to integer, squaring it and converting it back to string.通过将请求转换为 integer、对其进行平方并将其转换回字符串来做出响应。 This response is then sent back to client.然后将此响应发送回客户端。 'start_server' defines the server, function that will define its behavior(hello), ip address on witch the server is running on(192.168.1.117) and port on witch it will receive requests(8765). 'start_server' 定义服务器,function 将定义其行为(hello),ip 服务器运行的地址(192.168.1.117)和接收请求的端口(8765)。

!/usr/bin/env python

import asyncio
import websockets

print("Running...")

async def hello(websocket, path):
    request = await websocket.recv()
    print("Request: " + request)

    response = str(int(request)*int(request))

    await websocket.send(response)
    print("Response:" + response)

start_server = websockets.serve(hello, "192.168.1.117", 8765)

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

Next bit is code on the client.下一位是客户端上的代码。 'uri' is ip and port of the server. 'uri' 是 ip 和服务器的端口。 Function 'tellServ' asks you to input some data('tell' variable) and sends it to the server. Function 'tellServ' 要求您输入一些数据('tell' 变量)并将其发送到服务器。 After that it waits for reply and once it gets it it prints it out.之后它等待回复,一旦收到回复,它就会打印出来。 In this case if I would input number "6" server would reply with "36".在这种情况下,如果我输入数字“6”,服务器将回复“36”。 Function loop is in a while loop so I can send multiple numbers without having to restart the script. Function 循环处于 while 循环中,因此我可以发送多个号码而无需重新启动脚本。

#!/usr/bin/env python

import asyncio
import websockets

uri = "ws://192.168.1.117:8765"

async def tellServ():
    async with websockets.connect(uri) as websocket:
        tell = input("Podatek ki ga posles: ")
        await websocket.send(tell)

        reply = await websocket.recv()
        print("Odgovor:")
        print(reply)
while 1:
    asyncio.get_event_loop().run_until_complete(tellServ())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM