2013-05-15 12 views
6

Eigentlich hatte ich ein paar Fragen durchsucht und bin zum GitHub gegangen. Aber ich bin neu, ich kann das Beispiel nicht verstehen.Wie nanohttpd Server in Android erstellen?

Ich möchte den http-Server in Android erstellen, damit ich es im PC-Browser zugreifen kann.

Ich hatte Instanz eine Klasse nanohttpd erweitern, aber der Server funktioniert einfach nicht. Ich weiß nicht, warum, mein Computer und Telefon im gleichen WLAN-Zugang ist, äh .....

public class MyHTTPD extends NanoHTTPD { 

    /** 
    * Constructs an HTTP server on given port. 
    */ 
    public MyHTTPD()throws IOException { 
     super(8080); 
    } 


@Override 
    public Response serve(String uri, Method method, 
      Map<String, String> header, Map<String, String> parms, 
      Map<String, String> files) 
    { 
     System.out.println(method + " '222" + uri + "' "); 
     String msg = "<html><body><h1>Hello server</h1>\n"; 
     if (parms.get("username") == null) 
      msg += 
       "<form action='?' method='get'>\n" + 
       " <p>Your name: <input type='text' name='username'></p>\n" + 
       "</form>\n"; 
     else 
      msg += "<p>Hello, " + parms.get("username") + "!</p>"; 

     msg += "</body></html>\n"; 
     return new NanoHTTPD.Response(msg); 
    } 


    public static void main(String[] args) 
    { 
     try 
     { 
      new MyHTTPD(); 
     } 
     catch(IOException ioe) 
     { 
      System.err.println("Couldn't start server:\n" + ioe); 
      System.exit(-1); 
     } 
     System.out.println("Listening on port 8080. Hit Enter to stop.\n"); 
     try { System.in.read(); } catch(Throwable t) { 
      System.out.println("read error"); 
     }; 
    } 

} 
+0

Welche Version von nanohttpd verwenden Sie? – Stephan

Antwort

0

Dies ist der Code für mich arbeiten, aber ich habe andere Version von NANOHTTPD, ich weiß nicht haben Sie jetzt Zeit, Ihre Lösung zu testen. Hier ist UploadServer-Klasse und Nano-Klasse. Ich kehre Datei-Upload.htm aus sdcard/Discover Steuerung/Web Pfad

public class UploadServer extends NanoHTTPD { 
public UploadServer() throws IOException { 
    super(8080, new File(".")); 
} 

public Response serve(String uri, String method, Properties header, Properties parms, Properties files) { 
    File rootsd = Environment.getExternalStorageDirectory(); 
    File path = new File(rootsd.getAbsolutePath() + "/Discover Control/Web"); 
    Response r = super.serveFile("/file-upload.htm", header, path, true); 
    return r; 
} 
} 

NanoHttpd Klasse

NanoHTTPD.java

FILE UPLOAD

file-upload.htm

hoffe, das hilft und genießen Sie Ihren Arbeit.

+0

Der Link für Datei-Upload.htm scheint tot zu sein. Könnten Sie es bitte erneut hochladen? –

+0

Auch die Methode serveFile() funktioniert nicht und gibt den Fehler. 'Die Methode serveFile (String, Properties, File, boolean) ist für den Typ MainActivity nicht definiert. Wie kann ich das beheben? –

9

Ihrem Beispielcode fehlt ein kleines Detail - Sie erstellen den Server, aber Sie rufen nie die "start()" -Methode auf, die es startet, auf eingehende Verbindungen zu warten. In Ihrer Methode main(), könnten Sie

 (new MyHTTPD()).start(); 

schreiben und alles wäre gut, Ihr Server die Art und Weise reagieren würden Sie hoffte, es würde.

Der Grund, warum es so funktioniert, ist zweierlei: Ich möchte, dass der Konstruktor eine billige, kostengünstige Operation ohne Nebenwirkungen ist. Zum Beispiel, während Unit-Tests, ich rufe "Start()" in Setup und "stop()" in Teardown Methoden meiner jUnit-Test.

+0

Herr bitte sehen Sie sich http://StackOverflow.com/Questions/18055743/android-webserver-shows-html-pages-as-text – Prakhar

0

Android-Aktivitäten haben eine lifecycle und keine main() Funktion verwenden.

Wenn Sie möchten, starten und den Web-Server als Teil der Aktivität zu stoppen dann starten Sie müssen rufen und in und onResume zu stoppen, dh

public class MyActivity extends Activity { 

    private MyHTTPD mServer; 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     try { 
      mServer = new MyHTTPD(); 
      mServer.start(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      mServer = null; 
     } 


    @Override 
    protected void onPause() { 
     super.onPause(); 
     if(mServer != null) { 
      mServer.stop(); 
      mServer = null; 
     } 
    } 
} 

Eine Alternative ist es, die Webserver als Teil eines implementieren Bedienung.

In einer App, die ich arbeite, muss ich den Webserver laufen lassen, selbst wenn der Benutzer die App verlässt. Der einzige Weg dies zu tun, ist den Webserver als Teil eines lang laufenden Dienstes zu starten und zu stoppen, der nicht an die Aktivität gebunden ist. Siehe Vogella's great tutorial on Android Services.

Verwandte Themen