2

我刚刚开始学习 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()在服务器上有该功能,是否可以从客户端调用它并将响应显示给客户端?

4

5 回答 5

3

您必须向它发送某种消息,告诉服务器执行此操作。例如,您可以向它发送一个字符串“ADDME”,当服务器接收到它时,它会存储 addme() 的结果并将其发送回客户端,然后打印它。

于 2012-09-21T16:17:57.543 回答
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))
于 2012-09-21T16:22:41.893 回答
2

您需要设置自己的通信协议。发明一个命令,当您发送它时,使服务器执行某些功能。

要通过套接字发送数据(类似于类似文件的对象),您需要将其序列化(编码)为一组字节,并在另一端接收到这些字节后,对它们进行反序列化(解码)。

将函数的返回值编码为 JSON,以防它是字典,str以防它是整数,或者发明您自己的二进制协议,或者,如果您希望能够通过“线路”发送几乎任何类型的 Python 对象,然后腌制返回值。将编码(腌制)的返回值发送给客户端。然后它必须解码(unpickle)它。

在任何情况下,您都必须使用自己的命令集来实现自己的协议,而每个命令可能都有参数。您必须找到一种方法将命令与其参数分开,并且必须(in)验证您收到的命令。

对于学习网络通信,你的任务很棒。为了实现一个生产软件,你必须有一个外观和坚如磐石的消息库,如xmlrpclib其他人指出的那样。

于 2012-09-21T16:18:29.007 回答
1

听起来您正在尝试实现 RPC。有关现有库的讨论,请参见此处:在 Python 中执行 RPC 的当前选择是什么?

于 2012-09-21T16:20:53.267 回答
0

我就是这样做的

服务器.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')

客户端.py

import xmlrpc.client

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
print("the sum: %s" % str(proxy.addme(6,4)))

input('press enter')
于 2012-09-21T16:39:36.403 回答