我刚开始学习python,我想知道如何让客户端在服务器上执行一个函数并获得一些响应
这是我的服务器代码
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8089))
serversocket.listen(5)
while True:
connection, address = serversocket.accept()
buf = connection.recv(64)
if len(buf)> 0:
print(buf)
break
input('press enter')
这是客户端代码
import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8089))
data = 'lorem ipsum'
clientsocket.send(data.encode())
input('press enter')
这是函数
def addme(x,y):
return x + y
print (addme(6,4))
假设我在服务器上有函数addme()
,是否可以从客户端调用它并将响应显示给客户端?。
答案 0 :(得分:3)
你必须发送某种消息告诉服务器执行此操作。例如,您可以向它发送一个字符串“ADDME”,当服务器收到它时,它会存储addme()的结果并将其发送回客户端,然后打印出来。
答案 1 :(得分:3)
如果您只想调用函数,则应查看XMLRPC。简单易用,这是python文档中的示例。
# Server code
import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer
def is_even(n):
return n%2 == 0
server = SimpleXMLRPCServer(("localhost", 8000))
print "Listening on port 8000..."
server.register_function(is_even, "is_even")
server.serve_forever()
# Client code
import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
print "3 is even: %s" % str(proxy.is_even(3))
print "100 is even: %s" % str(proxy.is_even(100))
答案 2 :(得分:2)
您需要设置自己的通信协议。发明一个命令,当您发送它时,使服务器执行某些功能。
要通过套接字发送数据(与类似文件的对象相比),您需要将序列化(编码)成一组字节,并在另一端收到这些字节后, 反序列化(解码)那些。
将函数的返回值编码为例如JSON,如果是字典,str
,如果它是一个整数,或发明你自己的二进制协议,或者,如果你希望能够通过“电线”发送几乎任何类型的Python对象,那么pickle返回值。将编码(pickled)返回值发送到客户端。它必须解码(unpickle)然后。
在任何情况下,您都必须使用自己的命令集来实现自己的协议,而每个命令可能都有参数。您必须找到一种方法将命令与其参数分开,并且必须(在)中验证您收到的命令。
为了学习网络通信,您的任务非常棒。要实现生产软件,您必须具有外观和坚如磐石的消息传递库,例如其他人指出的xmlrpclib
。
答案 3 :(得分:1)
听起来你正在尝试实现RPC。有关现有库的讨论,请参见此处:What is the current choice for doing RPC in Python?
答案 4 :(得分:0)
我就这样做了
的 server.py 强> 的
from xmlrpc.server import SimpleXMLRPCServer
def addme(x,y):
return x + y
server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(addme, "addme")
server.serve_forever()
input('press enter')
的 client.py 强> 的
import xmlrpc.client
proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
print("the sum: %s" % str(proxy.addme(6,4)))
input('press enter')