Android搭建本地服务

在项目中涉及的本地server主要场景有两种:
1.实现类似于PC端视频播放的边看边缓冲,实现良好的播放体验
2.分享手机内容,如图片/音视频

目前接触到相关的比较好的框架是nanohttpdAndroidAsync。 若有其他的 欢迎分享哈-_-

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文件未测试。


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值