2012-10-18 48 views
0

这里是我的Python服务器代码...的Java帖子到Python HTTP服务器无法正常工作

#Copyright Jon Berg , turtlemeat.com 

import string,cgi,time 
from os import curdir, sep 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
#import pri 

class MyHandler(BaseHTTPRequestHandler): 

    # our servers current set ip address that clients should look for. 
    server_address = "0.0.0.0" 

    def do_GET(self): 
     try: 
      if self.path.endswith(".html"): 
       f = open(curdir + sep + self.path) 
       self.send_response(200) 
       self.send_header('Content-type', 'text/html') 
       self.end_headers() 

       str = "" 
       seq = ("<HTML>", MyHandler.server_address, "</HTML>") 
       str = str.join(seq) 
       print str 
       self.wfile.write(str) 
       return 
      return 

     except IOError: 
      self.send_error(404,'File Not Found: %s' % self.path) 


    def do_POST(self): 
     global rootnode 

     try: 
      ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) 
      if ctype == 'application/x-www-form-urlencoded': 
       query=cgi.parse_multipart(self.rfile, pdict) 
      self.send_response(301) 

      self.end_headers() 
      MyHandler.server_address = "".join(query.get('up_address')) 
      print "new server address", MyHandler.server_address 
      self.wfile.write("<HTML>POST OK.<BR><BR>") 

     except : 
      pass 

def main(): 
    try: 
     server = HTTPServer(('', 80), MyHandler) 
     print 'started httpserver...' 
     server.serve_forever() 
    except KeyboardInterrupt: 
     print '^C received, shutting down server' 
     server.socket.close() 

if __name__ == '__main__': 
    main() 

这里是我的Java代码来发布值为 “up_address” ......

static public void post(String address, String post_key, String post_value){ 

     try { 
      // Construct data 
      String data = URLEncoder.encode(post_key, "UTF-8") + "=" + URLEncoder.encode(post_value, "UTF-8"); 

      // Send data 
      URL url = new URL(address); 
      HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
      httpCon.setDoOutput(true); 
      httpCon.setRequestMethod("POST"); 
      httpCon.setRequestProperty("content-type", "application/x-www-form-urlencoded"); 
      httpCon.setRequestProperty("charset", "utf-8"); 
      httpCon.setRequestProperty("Content-Length", "" + Integer.toString(address.getBytes().length)); 
      httpCon.setUseCaches (false); 

      OutputStreamWriter wr = new OutputStreamWriter(httpCon.getOutputStream()); 
      wr.write(data); 
      wr.flush(); 

      // Get the response 
      BufferedReader rd = new BufferedReader(new InputStreamReader(httpCon.getInputStream())); 
      String line; 
      while ((line = rd.readLine()) != null) { 
       // Process line... 
      } 
      wr.close(); 
      rd.close(); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 

    } 

这一切似乎都很简单,但我无法成功发布到服务器。我得到两个错误之一。

服务器或者从未收到请求(蟒纹出不会发生),或者,它就会请求(打印),但不改变值(当它它打印的变化。

原来蟒蛇服务器的教程来了与直接更新值形式的HTML页面。这个表单页面完美的作品,但我需要能够从Java到POST。

我用下面的代码的Apache并且它也不起作用...

HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost(address); 
     try { 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
      nameValuePairs.add(new BasicNameValuePair(post_key, post_value)); 
      post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      HttpResponse response = client.execute(post); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
      String line = ""; 
      while ((line = rd.readLine()) != null) { 
      System.out.println(line); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

我不知道什么是错的。如果有帮助,我的文字POST键/值是“up_address = 10.0.1.2”。

这是所有的代码。你看到有什么问题吗?

+0

的服务器地址变量特定的其他机器的地址的值。代替cgi.parse_multipart为X WWW的窗体-urlencoded数据 – viperld002

+0

使用'urlparse.parse_qs()'。 – jfs

+0

我会试试这个,让你知道它是怎么回事(ty为你的回应)。 – viperld002

回答

0

我无法辨别的问题。我相信这是python服务器代码。

我决定重新实现服务器作为论据,而非get和POST一个GET。我导入到里urlparse抢追加到URL(source)键。然后我只是寻找我期望的w/e键。

这是我的新的服务器代码...(预期参数是 'up_address': '10.0.1.2')。

import string,cgi,time, urlparse 
from os import curdir, sep 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
#import pri 

class MyHandler(BaseHTTPRequestHandler): 

    # our servers current set ip address that clients should look for. 
    server_address = "0.0.0.0" 

    def do_GET(self): 
    qs = {} 
    path = self.path 
    if '?' in path: 
     path, tmp = path.split('?', 1) 
     qs = urlparse.parse_qs(tmp) 
     MyHandler.server_address = qs['up_address'] 
     print 'new server address: ', MyHandler.server_address 


def main(): 
    try: 
     server = HTTPServer(('', 8080), MyHandler) 
     print 'started httpserver...' 
     server.serve_forever() 
    except KeyboardInterrupt: 
     print '^C received, shutting down server' 
     server.socket.close() 

if __name__ == '__main__': 
    main() 

这似乎对我的项目的需要很好。