从python套接字服务器获得一些响应

时间:2012-09-21 16:14:42

标签: python

我刚开始学习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(),是否可以从客户端调用它并将响应显示给客户端?。

5 个答案:

答案 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')