簡體   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