2012-02-23 16 views
9

द्वारा रीसेट रीसेट करें मेरे पास एक एक्सएमएल आरपीसी सर्वर पायथन के साथ चल रहा है।PHP xmlrpc क्लाइंट और पायथन 2.5 xmlrpc सर्वर: अपूर्ण डेटा और सहकर्मी पीयर त्रुटि

इसे SimpleXMLRPCServer क्लास के उदाहरण के रूप में कार्यान्वित किया गया है।

from SimpleXMLRPCServer import SimpleXMLRPCServer 
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler 

class MyClass: 
    def getGeneExtraInfo(self,genome,infoType,elements): 
     print 'DEBUG:\ngenome: %s\ninfoType: %s, elements %s' % (genome,infoType,elements) 
     return 'A' * 10000 

csfServer = MyClass() 

server = SimpleXMLRPCServer((serverHost, serverPort), SimpleXMLRPCRequestHandler) 
server.register_instance(csfServer) 
server.serve_forever() 

csfServer विधि def getGeneExtraInfo(self,genome,infoType,elements) कि एक लंबी स्ट्रिंग देता है, पर विचार करने देता है, बस सादगी के लिए, कि 'ए' की returs 10000 पुनरावृत्ति है।

मैं इस कोड से पीएचपी के माध्यम से इस वेब सेवा का उपयोग:

function sendRequest($host, $url, $request, $port = 80) {                                  

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if ($socket === false) { 
     echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
     return FALSE; 
    } 

    $address = gethostbyname($host); 
    if (!socket_connect ($socket, $address, $port)) { 
     echo socket_strerror(socket_last_error()); 
     return FALSE; 
    } 

    $httpQuery = "POST ". $url ." HTTP/1.0\r\n"; 
    $httpQuery .= "User-Agent: xmlrpc\r\n"; 
    $httpQuery .= "Host: ". $host ."\r\n"; 
    $httpQuery .= "Content-Type: text/xml\r\n"; 
    $httpQuery .= "Content-Length: ". strlen($request) ."\r\n\r\n"; 
    $httpQuery .= $request ."\r\n"; 

    if (!socket_send($socket, $httpQuery , strlen($httpQuery), 0)) { 
     echo socket_strerror(socket_last_error()); 
     return FALSE; 
    } 

    $xmlResponse = ""; 
    $buff = ""; 
    while ($bytes = socket_recv($socket, $buff, 1024, MSG_WAITALL) > 0) { 
     $xmlResponse .= $buff; 
    } 

    // Just for debugging 
    echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n"; 

    socket_close($socket); 

    return $xmlResponse; 
} 

$request चर का निर्माण है:

$xmlrpc_output_options = array( 
         "output_type" => "xml", 
         "verbosity" => "no_white_space", 
         "escaping" => array("markup", "non-ascii", "non-print"), 
         "version" => "xmlrpc", 
         "encoding" => "UTF-8"); 


$xmlRequest = xmlrpc_encode_request('getGeneExtraInfo', array($genome,$infoType,$elements), $xmlrpc_output_options); 

(यह संभव है निम्नलिखित सी और अजगर के अंदर बनाया अनुरोध देखने के लिए कोड)

जब सर्वर सर्वर निष्पादित होता है तो PHP क्लाइंट और सर्वर ठीक से काम करता है जब सर्वर पाइथन 2.4 के साथ चल रहा है, लेकिन डी पायथन 2.5 या 2.6 के साथ, कभी-कभी (50% बार), डेटा अधूरा आता है और 'सहकर्मी द्वारा कनेक्शन रीसेट' त्रुटि के साथ आता है।

यह सत्यापित करने के लिए कि समस्या पाइथन या PHP के साथ है या नहीं, मैंने दो क्लाइंट, सी में और दूसरा पायथन में लिखा है। दोनों सॉकेट का उपयोग करते हैं और मुख्य रूप से PHP कोड कैसे काम करता है। "अनुरोध" सामग्री को PHP आउटपुट से कॉपी किया गया था, इसका मतलब है कि बिल्कुल PHP, C और पायथन के लिए अनुरोध है।

सी कोड:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 

void error(const char *msg) 
{ 
     perror(msg); 
      exit(0); 
} 

int main(int argc, char *argv[]) 
{ 
     int sockfd, n; 
     struct sockaddr_in serv_addr; 
     struct hostent *server; 

     char* hostname= "wks-13-15"; 
     int portno = 56572; 

     char buffer[1024]; 

     char request[] = "POST/HTTP/1.0\r\nUser-Agent: xmlrpc\r\nHost: wks-13-15\r\nContent-Type: text/xml\r\nContent-Length: 4479\r\n\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?><methodCall><methodName>getGeneExtraInfo</methodName><params><param><value><string>hg19</string></value></param><param><value><string>GO</string></value></param><param><value><array><data><value><string>GO:0044428</string></value><value><string>GO:0044422</string></value><value><string>GO:0044425</string></value><value><string>GO:0044424</string></value><value><string>GO:0043412</string></value><value><string>GO:0006464</string></value><value><string>GO:0009889</string></value><value><string>GO:0003824</string></value><value><string>GO:0016020</string></value><value><string>GO:0016021</string></value><value><string>GO:0048522</string></value><value><string>GO:0048523</string></value><value><string>GO:0090304</string></value><value><string>GO:0019538</string></value><value><string>GO:0051171</string></value><value><string>GO:0001882</string></value><value><string>GO:0001883</string></value><value><string>GO:0080090</string></value><value><string>GO:0042221</string></value><value><string>GO:0048869</string></value><value><string>GO:0019222</string></value><value><string>GO:0005488</string></value><value><string>GO:0005886</string></value><value><string>GO:0005524</string></value><value><string>GO:0031090</string></value><value><string>GO:0050896</string></value><value><string>GO:0010556</string></value><value><string>GO:0010468</string></value><value><string>GO:0016740</string></value><value><string>GO:0003677</string></value><value><string>GO:2000112</string></value><value><string>GO:0005622</string></value><value><string>GO:0019219</string></value><value><string>GO:0006139</string></value><value><string>GO:0032502</string></value><value><string>GO:0032501</string></value><value><string>GO:0050794</string></value><value><string>GO:0009058</string></value><value><string>GO:0032991</string></value><value><string>GO:0044249</string></value><value><string>GO:0044260</string></value><value><string>GO:0044267</string></value><value><string>GO:0035639</string></value><value><string>GO:0009987</string></value><value><string>GO:0044464</string></value><value><string>GO:0051252</string></value><value><string>GO:0043170</string></value><value><string>GO:0005634</string></value><value><string>GO:0005737</string></value><value><string>GO:0050789</string></value><value><string>GO:0031326</string></value><value><string>GO:0051716</string></value><value><string>GO:0016787</string></value><value><string>GO:0031323</string></value><value><string>GO:0006810</string></value><value><string>GO:0048856</string></value><value><string>GO:0065007</string></value><value><string>GO:0043227</string></value><value><string>GO:0043167</string></value><value><string>GO:0044459</string></value><value><string>GO:0043169</string></value><value><string>GO:0008150</string></value><value><string>GO:0008152</string></value><value><string>GO:0006355</string></value><value><string>GO:0005575</string></value><value><string>GO:0046914</string></value><value><string>GO:0003674</string></value><value><string>GO:0006807</string></value><value><string>GO:0003676</string></value><value><string>GO:0044446</string></value><value><string>GO:0044444</string></value><value><string>GO:0051234</string></value><value><string>GO:0032555</string></value><value><string>GO:0043228</string></value><value><string>GO:0043229</string></value><value><string>GO:0043226</string></value><value><string>GO:0045449</string></value><value><string>GO:0032559</string></value><value><string>GO:0031224</string></value><value><string>GO:0017076</string></value><value><string>GO:0071842</string></value><value><string>GO:0071841</string></value><value><string>GO:0071840</string></value><value><string>GO:0060255</string></value><value><string>GO:0016043</string></value><value><string>GO:0034641</string></value><value><string>GO:0008270</string></value><value><string>GO:0000166</string></value><value><string>GO:0046872</string></value><value><string>GO:0044237</string></value><value><string>GO:0044238</string></value><value><string>GO:0043234</string></value><value><string>GO:0043231</string></value><value><string>GO:0043232</string></value><value><string>GO:0032553</string></value><value><string>GO:0005515</string></value><value><string>GO:0007165</string></value><value><string>GO:0048519</string></value><value><string>GO:0048518</string></value><value><string>GO:0030554</string></value></data></array></value></param></params></methodCall>"; 

     fprintf(stderr, "%s\n", request); 

     sockfd = socket(AF_INET, SOCK_STREAM, 0); 
     if (sockfd < 0) 
      error("ERROR opening socket"); 
     server = gethostbyname(hostname); 

     if (server == NULL) { 
      fprintf(stderr,"ERROR, no such host\n"); 
      exit(0); 
     } 

     bzero((char *) &serv_addr, sizeof(serv_addr)); 
     serv_addr.sin_family = AF_INET; 
     bcopy((char *)server->h_addr, 
       (char *)&serv_addr.sin_addr.s_addr, 
       server->h_length); 

     serv_addr.sin_port = htons(portno); 

     if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
      error("ERROR connecting"); 

     fprintf(stderr, "%d\n", strlen(request)); 

     n = write(sockfd,request,strlen(request)); 
     if (n < 0) 
      error("ERROR writing to socket"); 

     fprintf(stderr, "%d\n", n); 

     bzero(buffer,1024); 
     while (read(sockfd,buffer,1023) > 0) { 
      printf("%s",buffer); 
      bzero(buffer,1024); 
     } 

     if (n < 0) 
      error("ERROR reading from socket"); 

     close(sockfd); 

     return 0; 
} 

अजगर कोड:

import socket 

request = """POST/HTTP/1.0 
User-Agent: xmlrpc 
Host: wks-13-15 
Content-Type: text/xml 
Content-Length: 4479 

<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>getGeneExtraInfo</methodName><params><param><value><string>hg19</string></value></param><param><value><string>GO</string></value></param><param><value><array><data><value><string>GO:0044428</string></value><value><string>GO:0044422</string></value><value><string>GO:0044425</string></value><value><string>GO:0044424</string></value><value><string>GO:0043412</string></value><value><string>GO:0006464</string></value><value><string>GO:0009889</string></value><value><string>GO:0003824</string></value><value><string>GO:0016020</string></value><value><string>GO:0016021</string></value><value><string>GO:0048522</string></value><value><string>GO:0048523</string></value><value><string>GO:0090304</string></value><value><string>GO:0019538</string></value><value><string>GO:0051171</string></value><value><string>GO:0001882</string></value><value><string>GO:0001883</string></value><value><string>GO:0080090</string></value><value><string>GO:0042221</string></value><value><string>GO:0048869</string></value><value><string>GO:0019222</string></value><value><string>GO:0005488</string></value><value><string>GO:0005886</string></value><value><string>GO:0005524</string></value><value><string>GO:0031090</string></value><value><string>GO:0050896</string></value><value><string>GO:0010556</string></value><value><string>GO:0010468</string></value><value><string>GO:0016740</string></value><value><string>GO:0003677</string></value><value><string>GO:2000112</string></value><value><string>GO:0005622</string></value><value><string>GO:0019219</string></value><value><string>GO:0006139</string></value><value><string>GO:0032502</string></value><value><string>GO:0032501</string></value><value><string>GO:0050794</string></value><value><string>GO:0009058</string></value><value><string>GO:0032991</string></value><value><string>GO:0044249</string></value><value><string>GO:0044260</string></value><value><string>GO:0044267</string></value><value><string>GO:0035639</string></value><value><string>GO:0009987</string></value><value><string>GO:0044464</string></value><value><string>GO:0051252</string></value><value><string>GO:0043170</string></value><value><string>GO:0005634</string></value><value><string>GO:0005737</string></value><value><string>GO:0050789</string></value><value><string>GO:0031326</string></value><value><string>GO:0051716</string></value><value><string>GO:0016787</string></value><value><string>GO:0031323</string></value><value><string>GO:0006810</string></value><value><string>GO:0048856</string></value><value><string>GO:0065007</string></value><value><string>GO:0043227</string></value><value><string>GO:0043167</string></value><value><string>GO:0044459</string></value><value><string>GO:0043169</string></value><value><string>GO:0008150</string></value><value><string>GO:0008152</string></value><value><string>GO:0006355</string></value><value><string>GO:0005575</string></value><value><string>GO:0046914</string></value><value><string>GO:0003674</string></value><value><string>GO:0006807</string></value><value><string>GO:0003676</string></value><value><string>GO:0044446</string></value><value><string>GO:0044444</string></value><value><string>GO:0051234</string></value><value><string>GO:0032555</string></value><value><string>GO:0043228</string></value><value><string>GO:0043229</string></value><value><string>GO:0043226</string></value><value><string>GO:0045449</string></value><value><string>GO:0032559</string></value><value><string>GO:0031224</string></value><value><string>GO:0017076</string></value><value><string>GO:0071842</string></value><value><string>GO:0071841</string></value><value><string>GO:0071840</string></value><value><string>GO:0060255</string></value><value><string>GO:0016043</string></value><value><string>GO:0034641</string></value><value><string>GO:0008270</string></value><value><string>GO:0000166</string></value><value><string>GO:0046872</string></value><value><string>GO:0044237</string></value><value><string>GO:0044238</string></value><value><string>GO:0043234</string></value><value><string>GO:0043231</string></value><value><string>GO:0043232</string></value><value><string>GO:0032553</string></value><value><string>GO:0005515</string></value><value><string>GO:0007165</string></value><value><string>GO:0048519</string></value><value><string>GO:0048518</string></value><value><string>GO:0030554</string></value></data></array></value></param></params></methodCall>""" 

HOST = "wks-13-15" 
PORT = 56572 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 
s.sendall(request) 

while 1: 
     data = s.recv(1024) 
     print data 
     if not data: break 

s.close() 

दोनों कार्यक्रमों काम करते हैं और पूरे प्रतिक्रिया डेटा प्राप्त करता है।

मैंने पहले से ही एन्कोडिंग को बदलने की कोशिश की है, PHP को डेटा कैसे पढ़ा जाता है, यह बदलता है, लेकिन अपर्याप्त डेटा और सहकर्मी समस्या द्वारा कनेक्शन रीसेट जारी रहता है।

मेरे सवालों का: (उनमें से किसी को जवाब देने के लिए स्वतंत्र लग रहा है :-))

  • क्यों सी और अजगर कार्यक्रमों काम करता है, जबकि पीएचपी कभी कभी नहीं करता है?
  • कभी-कभी PHP कोड क्यों काम करता है, और अन्य नहीं करते हैं?
  • सर्वर के साथ एक पायथन 2.4 पर चल रहा है, PHP क्लाइंट कोड काम करता है, और पायथन 2.5 और 2.6 के साथ नहीं है?
  • मैं इसे कैसे हल कर सकता हूं? सुझावों का स्वागत है।
+1

कोशिश अब गलत – Electronick

+0

@Electronick अवलोकन के लिए धन्यवाद, लेकिन समस्या बनी रहती है। (मैं कोड उदाहरण अपडेट करूंगा)। – Pih

+0

शायद fsockopen के लिए सॉकेट बदलने की कोशिश करें? "सहकर्मी द्वारा कनेक्शन रीसेट" इंगित करता है कि आपके पास कनेक्शन समस्याएं हैं (पिंग? सॉकेट लेखन? पैकेट खो गया है?) – Electronick

उत्तर

2

मैं xml_rpc कक्षा का उपयोग करता हूं, मुझे यकीन नहीं है कि PHP का कौन सा संस्करण इसके साथ शुरू हुआ लेकिन यह मेरे लिए काम करता है। यह भी एक सरणी से आपके अनुरोध सांकेतिक शब्दों में बदलना होगा, लेकिन मैं यह कर देते हैं अगर आप पहले से ही अनुरोध के लिए अपने XML है:

पीएचपी `\ r \ php में n`, अपने हेडर का उपयोग करने के

function sendRequest($host, $url, $request, $port = 80) { 

//create the context to send to the xmlrpc server 
$context = stream_context_create(array('http' => array(
    'method' => "POST", 
    'header' => "Content-Type: text/xml\r\nUser-Agent: PHPRPC/1.0\r\n", 
    'content' => $request 
))); 

//i am not sure how to get the url, normally something like http://server/api/xml 
$server = "http://$host:$port"; //? 

//store the response 
$file = file_get_contents($server, false, $context); 
//decode the response to xml 
$return xmlrpc_decode($file); 
} 
+0

मैंने आपके फ़ंक्शन की नकल करने के लिए अपडेट किया है, मुझे यकीन है कि आपका सर्वर यूआरएल कैसा दिखता है, बस कोड पर देखकर मुझे लगता है कि आप होस्ट नाम को डीकोड कर रहे हैं आप अपने मेजबान को '$ सर्वर' यूआरएल को इंगित करने का तरीका समझ सकते हैं लेकिन यह प्रत्येक xmlrpc अनुरोध के लिए काम करता है जिसे मैंने कभी भी PHP के साथ बनाने का प्रयास किया है। –