繁体   English   中英

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

[英]Getting some response from a python socket server

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

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

如果您只是想调用函数,则应该查看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))

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

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

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

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

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

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

这就是我做到的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM