实际上,我搜索了一些问题然后去了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");
};
}
}
答案 0 :(得分:10)
您的示例代码缺少一个小细节 - 您创建了服务器,但您从未调用“start()”方法,该方法将其启动以侦听传入连接。在main()方法中,您可以编写
(new MyHTTPD()).start();
一切都会好的,您的服务器会以您希望的方式响应。
它以这种方式工作的原因有两个:我希望构造函数是一种廉价,廉价的操作,没有副作用。例如,在单元测试时,我在 setup 中调用“start()”,在我的jUnit测试的拆卸方法中调用“stop()”。
答案 1 :(得分:0)
这是为我工作的代码,但我有不同版本的NANOHTTPD,我现在没时间测试你的解决方案。这是UploadServer类和Nano类。我从sdcard / Discover Control / Web path
返回file-upload.htmpublic 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类
文件上传
希望这有助于并享受您的工作。
答案 2 :(得分:0)
Android活动有lifecycle,不使用main()
功能。
如果您想在活动中启动和停止网络服务器,则需要调用start和stop
在onPause
和onResume
中,即
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);
}