【问题标题】:Getting some response from a python socket server从 python 套接字服务器获得一些响应
【发布时间】:2012-09-14 02:16:06
【问题描述】:

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

【问题讨论】:

    标签: python


    【解决方案1】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        对于学习网络通信,你的任务很棒。为了实现生产软件,您必须了解和坚如磐石的消息传递库,如其他人指出的xmlrpclib

        【讨论】:

        【解决方案4】:

        听起来您正在尝试实现 RPC。有关现有库的讨论,请参见此处:What is the current choice for doing RPC in Python?

        【讨论】:

          【解决方案5】:

          我就是这样做的

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

          【讨论】:

            猜你喜欢
            • 2014-02-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-11
            相关资源
            最近更新 更多