如何在android中创建nanohttpd服务器?

时间:2013-05-15 08:32:18

标签: android http nanohttpd

实际上,我搜索了一些问题然后去了github。但我是新人,我无法理解这个例子。

我想在android中创建http服务器,所以我可以在PC浏览器中访问它。

我有一个类扩展nanohttpd,但服务器不起作用。我不知道为什么,我的电脑和手机都在同一个WIFI,呃......

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");
        };
    }

}

4 个答案:

答案 0 :(得分:10)

您的示例代码缺少一个小细节 - 您创建了服务器,但您从未调用“start()”方法,该方法将其启动以侦听传入连接。在main()方法中,您可以编写

        (new MyHTTPD()).start();

一切都会好的,您的服务器会以您希望的方式响应。

它以这种方式工作的原因有两个:我希望构造函数是一种廉价,廉价的操作,没有副作用。例如,在单元测试时,我在 setup 中调用“start()”,在我的jUnit测试的拆卸方法中调用“stop()”。

答案 1 :(得分:0)

这是为我工作的代码,但我有不同版本的NANOHTTPD,我现在没时间测试你的解决方案。这是UploadServer类和Nano类。我从sdcard / Discover Control / Web path

返回file-upload.htm
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类

NanoHTTPD.java

文件上传

file-upload.htm

希望这有助于并享受您的工作。

答案 2 :(得分:0)

Android活动有lifecycle,不使用main()功能。

如果您想在活动中启动和停止网络服务器,则需要调用start和stop 在onPauseonResume中,即

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;
        }
    }
}

另一种方法是将Web服务器实现为服务的一部分。

在我正在工作的应用中,即使用户离开应用,我也要求保持网络服务器正常运行。执行此操作的唯一方法是启动和停止Web服务器,作为未绑定到Activity的长时间运行的服务的一部分。请参阅Vogella's great tutorial on Android Services

答案 3 :(得分:0)

此代码可用于在我的评估文件夹中精细查看具有css类的html页面

androidWebServer.start();

这将在服务器功能代码下方启动服务器

public class AndroidWebServer extends NanoHTTPD {

Realm realm;

Map<String, String> parms;
DBHelper db = new DBHelper(OpenRAP.getContext());
boolean isStartedHS = MainActivity.isStartedHS;
private AsyncHttpServer server = new AsyncHttpServer();
private AsyncServer mAsyncServer = new AsyncServer();
private String TAG = "androidwebserver";
Storage storage = new Storage(OpenRAP.getContext());
public AndroidWebServer(int port) {
    super(port);
}


public AndroidWebServer(String hostname, int port) {
    super(hostname, port);
}


@Override
public String getHostname() {
    return super.getHostname();
}


@Override
public Response serve(IHTTPSession session) {
    Method method = session.getMethod();
    String uri = session.getUri();
    Map<String, String> files = new HashMap<>();
    SharedPreferences prefs = OpenRAP.getContext().getSharedPreferences(MainActivity.mypreference, MODE_PRIVATE);
    OpenRAP app = (OpenRAP) OpenRAP.getContext();
    Storage storage = new Storage(OpenRAP.getContext());
    String currentpath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/www/";
    String temp = Environment.getExternalStorageDirectory().getAbsolutePath() + "/www/temp/";
    String ecarpath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/www/ecars_files/";
    String xcontent = Environment.getExternalStorageDirectory().getAbsolutePath() + "/www/xcontent/";
    String Endpoint = session.getUri();
    if (Endpoint.equals("/")) {

        String answer = "";
        try {
            // Open file from SD Card
            File root = Environment.getExternalStorageDirectory().getAbsoluteFile();
            FileReader index = new FileReader(root +
                    "/www/openrap/index.html");
            BufferedReader reader = new BufferedReader(index);
            String line = "";
            while ((line = reader.readLine()) != null) {
                answer += line;
            }
            reader.close();
        } catch (IOException ioe) {
            Log.w("Httpd", ioe.toString());
        }
        return newFixedLengthResponse(answer);
    }