我想会有新手像我一样得到了代码也不知道怎么去实验,嘿嘿。。别着急
我是用ubuntu的,所以开一个终端 启动一下server端,在开一个终端窗口执行client端就OK了
异步调用基本使用过程:
async_function_obj=rpyc.async(c.root.get_time) #关联一个异步对象到目标函数
result_obj=async_function() #通知服务端在适当的时候调用目标函数
if result_obj.ready: #查询服务端是否已经完成了函数调用
print result_obj.value #打印函数返回值
回调函数:让服务端在完成目标函数调用后,调用一个客户端函数。此时客户端将自己的一个函数对象传递给服务端函数作为一个参数,服务端函数完成工作后调用此函数。
事件通知:客户端如果不处理任何返回值,可以作为事件通知机制,通知服务端运行某函数。
(异步的工作交与服务端处理了。)
rpyc/servers/classic_server.py
rpyc/servers/registry_server.py
内置的两个工具这个就有点像Django的工具一样的!
registry-server类似于dns服务器,简化了对rpyc服务所在ip、端口的记忆。
在一个局域网中只需要一个此服务,一旦局域网中有一个主机运行了registry-server.py,那么我们就可以使用名字来连接服务。
将IP与端口与域名进行了绑定处理。
RPYC—自带服务—classic_server.py
提供的功能:
eval
execute
modules
使用:c.root.eval或c.eval(对classic_server特例)来访问
客户端访问:
c=rpyc.classic.connect(“localhost”) #连接
c.modules.os.system(‘ls’) #用modules可访问任何服务端库
c.eval(‘1+23’) #简单python语句执行
认证:
(在编写RMI程序的时候就需要有一个认证的过程)
1:
服务端提供:
def exposed_login(user,pass) 函数
def exposed_logout()函数
其他exposed函数中检查用户是否登录,没有登录则直接返回。
RPYC提供了两个服务:
ThreadedServer
ForkingServer
服务可调用函数有:
start
register
unregister
close
fileno
server端代码实例:
# coding:utf-8
from rpyc import Service
from rpyc.utils.server import ThreadedServer
class TestService(Service):
# 对于服务端来说, 只有以"exposed_"打头的方法才能被客户端调用,所以要提供给客户端的方法都得加"exposed_"
def exposed_test(self, num):
return 1+num
sr = ThreadedServer(TestService, port=9911, auto_register=False)
sr.start()
client端代码实例:
# coding:utf-8
import rpyc
# 参数主要是host, port
conn =rpyc.connect('localhost',9911)
# test是服务端的那个以"exposed_"开头的方法
cResult =conn.root.test(1)
conn.close()
print cResult
注:对于返回值cResult
1、如果cResult是数字或字符串的话,那么在conn.close()之后,你可以用cResult的值
2、如果cResult是其它类型的数据的话, 你conn.close()之后,cResult就为空的了(这是因为对于其它类型的返回值,服务端返回的是rpyc.netref的封装nobj, 当访问nobj时,它连接到服务端,取值,并返回给客户端,你close之后就连不到服务端了),所以最好在服务端把计算结果处理下,转换成数字或字符串(对于大字典来说,可以用json转换下,然后客户端再转过来就ok了)