[英]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.