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、整数の場合はJSONに、独自のバイナリプロトコルを発明する場合は、または「ワイヤー」を介してほぼすべての種類のPythonオブジェクトを送信できるようにする場合にエンコードします。 、次に戻り値をピクルスします。エンコードされた(ピクルスにされた)戻り値をクライアントに送信します。次に、それをデコード(アンピック)する必要があります。

いずれの場合も、各コマンドに引数がある場合でも、独自のコマンドセットを使用して、独自のプロトコルを実装する必要があります。コマンドを引数から分離する方法を見つける必要があり、受け取ったコマンドを(無効に)検証する必要があります。

ネットワーク通信を学ぶために、あなたの仕事は素晴らしいです。xmlrpclib本番ソフトウェアを実装するには、他の人が指摘しているような見た目と堅実なメッセージングライブラリが必要です。

于 2012-09-21T16:18:29.007 に答える
1

RPCを実装しようとしているようです。既存のライブラリに関する議論については、ここを参照してください:PythonでRPCを実行するための現在の選択は何ですか?

于 2012-09-21T16:20:53.267 に答える
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')
于 2012-09-21T16:39:36.403 に答える