在项目中涉及的本地server主要场景有两种:
1.实现类似于PC端视频播放的边看边缓冲,实现良好的播放体验
2.分享手机内容,如图片/音视频
目前接触到相关的比较好的框架是nanohttpd和AndroidAsync。 若有其他的 欢迎分享哈-_-
nanohttpd是一个轻量级的http服务框架,源码只有一个文件,应用也非常方便,如官方的一个简单的例子:
public class App extends NanoHTTPD {
public App() throws IOException {
super(8080);
start();
System.out.println( "\nRunning! Point your browers to http://localhost:8080/ \n" );
}
public static void main(String[] args) {
try {
new App();
}
catch( IOException ioe ) {
System.err.println( "Couldn't start server:\n" + ioe );
}
}
@Override
public Response serve(IHTTPSession session) {
String msg = "<html><body><h1>Hello server</h1>\n";
Map<String, String> parms = session.getParms();
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>";
}
return newFixedLengthResponse( msg + "</body></html>\n" );
}
}
搭建自己的服务只需集成NanoHTTPD即可实现,在serve方法中封装实现响应形式,例子中是响应html。
AndroidAsync 是一个多功能库,从其中脱离出来的异步通信和图片加载框架ion非常受欢迎。AndroidAsync主要是一个基于NIO的异步socket,websocket,http客户端/服务端的通信框架,这里主要用到是http server。
下面这个是一个简单的返回网页的例子
AsyncHttpServer server = new AsyncHttpServer();
server.get("/", new HttpServerRequestCallback() {
@Override
public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
response.send("Hello!!!");
}
});
// listen on port 5000
server.listen(5000);
// browsing http://localhost:5000 will return Hello!!!
AsyncHttpServer是服务的核心类,用于服务的启动/停止,响应回调定义处理,webscoket及本地目录/文件服务。
利用server.directory即可实现本地文件服务,如
server.directory("/name" ,new File(filePath))
访问地址:http://localhost:5000/name。
遇到的问题:
1.服务启动时默认地址是localhost,经常导致外部无法访问?
答:修改为IP,修改AsyncServer的listen方法中地址的设置.
java
if (host == null)
isa = new InetSocketAddress(port);
else
isa = new InetSocketAddress(host, port);
修改为
if (host == null)
isa = new InetSocketAddress(getLocalIp4Address(), port);
else
isa = new InetSocketAddress(host, port);
2.搭建本地文件服务,但是无法正常访问
答:在AsyncHttpServer本地文件服务映射时调用directory方法中修改
String type = getContentType(file.getAbsolutePath());
response.setContentType(type);
response.sendFile(file);
// Util.pump(is, response, new CompletedCallback() {
// @Override
// public void onCompleted(Exception ex) {
// response.end();
// }
// });
这里只是针对sd卡文件,对于asset文件未测试。