Android搭建本地服务

来源:互联网 发布:淘宝如何找到卖家电话 编辑:程序博客网 时间:2024/05/23 22:57

在项目中涉及的本地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 5000server.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文件未测试。


0 0
原创粉丝点击