2012-09-21 29 views
1

我剛開始學習Python的,我想知道我怎麼會得到客戶端向服務器上執行的功能,並得到了一些響應充分利用Python的socket服務器的一些響應

這裏是我的服務器代碼

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(),是否可以從客戶端調用它並將響應顯示給客戶端?

回答

2

如果您只是想調用函數,則應該檢出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)) 
3

你必須向它發送一些消息,告訴服務器執行此操作。例如,您可以發送一個字符串「ADDME」,當服務器收到這個字符串時,它將addme()的結果存儲起來,並將其發送回客戶端,然後打印出來。

2

您需要設置自己的通信協議。創建一個命令,當你發送它時,使服務器執行一些功能。

要通過套接字(相當於一個類文件對象),則需要連載(編碼)成一組的字節發送數據,並且在接收在另一端這些字節後,反序列化(解碼)這些。

將函數的返回值編碼爲例如如果是字典,則爲JSON;如果是整數,則爲str;或者創建自己的二進制協議,或者,如果希望能夠通過「電線」發送幾乎任何類型的Python對象,則返回值爲pickle 。將編碼(醃製)的返回值發送給客戶端。它必須解碼(unpickle)然後。

在任何情況下,您都必須使用自己的一組命令來實現自己的協議,而每個命令都可能有參數。你必須找到一種方法將命令與它的參數分開,並且必須(在)驗證你收到的命令。

對於學習網絡溝通,你的任務是偉大的。爲了實施生產軟件,您必須擁有外觀和堅如磐石的消息庫,如xmlrpclib,正如其他人所指出的那樣。

+0

[注意](http://blog.nelhage.com/2011/03/exploiting-pickle/)使用'在網絡上pickle' ... –

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

客戶端。PY

import xmlrpc.client 

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/") 
print("the sum: %s" % str(proxy.addme(6,4))) 

input('press enter')