1. 当前位置:网站首页 > Python

Pyro4的一个简单通信案例


服务之间快速进行数据交互的一种方式

# server.py

import Pyro4

# 创建一个简单的远程对象
@Pyro4.expose
class MyRemoteObject:
    def say_hello(self, name):
        return f"Hello, {name}!"

def main():
    daemon = Pyro4.Daemon()
    uri = daemon.register(MyRemoteObject)

    print("Server URI:", uri)

    with open("server_uri.txt", "w") as f:
        f.write(str(uri))

    print("Server is ready.")
    daemon.requestLoop()

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

import Pyro4

def main():
    with open("server_uri.txt", "r") as f:
        server_uri = f.read()

    with Pyro4.Proxy(server_uri) as remote_object:
        remote_object._pyroTimeout = 0.02
        try:
            name = input("Enter your name: ")
            result = remote_object.say_hello(name)
            print("Server response:", result)
        except Exception as e:
            print("Server did not respond within the specified timeout.")

if __name__ == "__main__":
    main()

客户端示例

# client.py
import sys
import threading
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton
import Pyro4

# 创建 PySide6 应用程序
app = QApplication(sys.argv)

# 创建 PySide6 窗口
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 创建主窗口布局和容器
        central_widget = QWidget(self)
        layout = QVBoxLayout(central_widget)
        self.setCentralWidget(central_widget)

        # 创建一个标签用于显示 Pyro4 数据
        self.label = QLabel("Pyro4 Data: None", self)
        layout.addWidget(self.label)

        # 创建按钮用于退出应用程序
        exit_button = QPushButton("Exit", self)
        layout.addWidget(exit_button)

        # 连接按钮的点击事件到退出应用程序
        exit_button.clicked.connect(self.close)

        # 启动 Pyro4 服务线程
        self.pyro_thread = PyroThread()
        self.pyro_thread.data_updated.connect(self.update_ui)
        self.pyro_thread.start()

    def update_ui(self, data):
        # 在这里更新 UI,例如更新标签的文本
        self.label.setText(f"Pyro4 Data: {data}")

# 创建 Pyro4 服务线程
class PyroThread(threading.Thread):
    data_updated = Pyro4.QtCore.Signal(str)

    def run(self):
        # 在这里监听 Pyro4 数据更新
        Pyro4.config.SERIALIZER = 'pickle'  # 使用 pickle 序列化
        Pyro4.Daemon.serveSimple(
            {ExampleClass: "example"},
            host="localhost",
            port=9999,
            ns=False,     # 注册服务
            verbose=True  # 日志
        )

if __name__ == "__main__":
    # 创建 PySide6 主窗口
    main_window = MainWindow()
    main_window.show()

    # 运行 PySide6 应用程序
    sys.exit(app.exec())
# server.py
import Pyro4

# 指定服务器的IP地址和端口号
server_host = "192.168.1.100"
server_port = 9999

# 创建服务器的URI
server_uri = f"PYRO:example@{server_host}:{server_port}"

# 创建一个PYRO代理对象来连接到服务器
remote_object = Pyro4.Proxy(server_uri)

# 调用远程对象的方法
result = remote_object.some_method()

# 处理远程方法的返回值
print(result)

本文最后更新于2023-10-24,已超过 3个月没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
版权说明

本文地址:http://www.liuyangdeboke.cn/?post=59
未标注转载均为本站远程,转载请注明文章出处:

发表评论

联系我们

在线咨询:点击这里给我发消息

微信号:17721538135

工作日:9:00-23:00,节假日休息

扫码关注