2012-09-21 2 views
1
내 서버 코드

파이썬 소켓 서버에서 일부 응답을 얻는 것은

난 그냥 파이썬을 배우기 시작했고 나는 클라이언트가 서버의 기능을 실행하고 일부 응답 여기

을 얻을 수 얼마나 궁금하다

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

이며,이 함수

012입니다

서버에 addme()이라는 기능이 있다고 가정하면 클라이언트에서 응답을 호출하고 클라이언트에서 응답을 표시 할 수 있습니까?

답변

2

단순히 함수를 호출하려면 XMLRPC를 확인해야합니다. 간단하고 쉬운, 여기에 파이썬 문서의 예제가있다.

# 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 인 경우 정수형이거나 자신의 바이너리 프로토콜을 고안하십시오. 또는 "wire"를 통해 거의 모든 종류의 Python 객체를 보내려는 경우 pickle 반환 값 . 인코딩 된 (절인 된) 반환 값을 클라이언트에 보냅니다. 그런 다음 디코딩 (unpickle)해야합니다.

어떤 경우에도 각 명령에 인수가있을 수 있지만 고유 한 명령 집합을 사용하여 자체 프로토콜을 구현해야합니다. 명령을 인수에서 분리하는 f}을 찾아야하며 수신 한 명령의 유효성을 검증해야합니다.

학습 네트워크 통신을 위해 작업이 훌륭합니다. 프로덕션 소프트웨어를 구현하려면 다른 사람이 지적한 바와 같이 모양과 견고한 메시지 라이브러리 (예 :)이 있어야합니다.

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

클라이언트했던 방법이다.평

import xmlrpc.client 

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

input('press enter') 
관련 문제