Android 创建服务器 NanoHttpd

android 特殊手机终端创建一个服务器 对外公开地址(生成一个二维码的地址) 扫码识别点开为一个web 页面,可以下载本地的相关资源 或者播放本地的资源

使用NanoHttpd在Android项目中搭建服务器

android 服务器播放视频
其实都大同小异

也可以这种搭建服务器
AndServer,一个Android端的web服务器
这种比较繁琐

我的包直接用的 [android 服务器播放视频] 项目里面的lib

package com.pad.ui.activity.progressbar;



import android.util.Log;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

import fi.iki.elonen.NanoHTTPD;
import fi.iki.elonen.NanoHTTPD.Response.Status;


public class FileServer extends NanoHTTPD{

    public static final int DEFAULT_SERVER_PORT= 8080;//为8080
    public static final String TAG = FileServer.class.getSimpleName();
    //根目录
    private static  final String REQUEST_ROOT = "/";
    private List<SharedFile> fileList;//用于分享的文件列表



    public FileServer(List<SharedFile> fileList) {
        super(DEFAULT_SERVER_PORT);
        this.fileList = fileList;
    }

    @Override
    public Response serve(IHTTPSession session) {
        Log.d(TAG,"OnRequest: "+session.getUri());
        if(REQUEST_ROOT.equals(session.getUri())||session.getUri().equals("")){
            return responseRootPage(session);
        }
        return responseFile(session);
//        return response404(session,session.getUri());
    }
    //对于请求根目录的,返回分享的文件列表
    public Response responseRootPage(IHTTPSession session) {
        StringBuilder builder = new StringBuilder();
        builder.append("<!DOCTYPER html><html><body>");
        builder.append("<ol>");
        for (int i = 0, len = fileList.size(); i < len; i++) {
            File file = new File(fileList.get(i).getPath());
            if (file.exists()) {
                //文件及下载文件的链接,定义了一个文件类,这里使用getPath方法获得路径,使用getName方法获得文件名
                builder.append("<li> <a href=\"" + file.getPath() + "\">" + file.getName() + "</a></li>");
            }
        }
        builder.append("<li>File Size:  " + fileList.size() + "</li>");
        builder.append("</ol>");
        builder.append("</body></html>\n");
        //回送应答
        return new Response(String.valueOf(builder));
    }
    //对于请求文件的,返回下载的文件
    public Response responseFile(IHTTPSession session){
        try {
            //uri:用于标示文件资源的字符串,这里即是文件路径
            String uri = session.getUri();
            FileInputStream fis = new FileInputStream(uri);
            return new Response(Status.OK,"application/octet-stream",fis);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return response404(session,null);
    }

    public Response response404(IHTTPSession session,String url) {
        StringBuilder builder = new StringBuilder();
        builder.append("<!DOCTYPE html><html><body>");
        builder.append("Sorry, Can't Found "+url + " !");
        builder.append("</body></html>\n");
        return new Response(builder.toString());
    }


}

activity 主要实现 服务的开启与关闭 随带吧url 生成二维码方便外部访问下载 (同一局域网访问下载)


   private static final String DEFAULT_FILE_PATH = Environment.getExternalStorageDirectory() + "/movie.mp4";
  
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ipStr = getIpAddress(ProgressBarActivity.this);
        String macStr = getMacAddressFromIp(ProgressBarActivity.this);
        showIp.setText("IP : " + ipStr);

        mVideoServer = new VideoServer(DEFAULT_FILE_PATH, VIDEO_WIDTH, VIDEO_HEIGHT, VideoServer.DEFAULT_SERVER_PORT);
        showIp.setText("请在远程浏览器中输入:\n\n" + ipStr + ":" + VideoServer.DEFAULT_SERVER_PORT);
        List<SharedFile> sharedFileList = new ArrayList<>();
        SharedFile sharedFile = new SharedFile();
        sharedFile.setName("movie.mp4");
        sharedFile.setPath(DEFAULT_FILE_PATH);
        sharedFileList.add(sharedFile);
        SharedFile sharedFile01 = new SharedFile();
        sharedFile01.setName("人员.xlsx");
        sharedFile01.setPath(Environment.getExternalStorageDirectory() + "/mo.xlsx");
        sharedFileList.add(sharedFile01);

        fileServer = new FileServer(sharedFileList);

        handler.post(new Runnable() {
            @Override
            public void run() {

                Bitmap qrccode = QRCodeEncoder.syncEncodeQRCode(ipStr + ":" + VideoServer.DEFAULT_SERVER_PORT+
                        DEFAULT_FILE_PATH,400);
//                Bitmap qrccode = QRCodeEncoder.syncEncodeQRCode(ipStr + ":" + VideoServer.DEFAULT_SERVER_PORT,200);
                showZxing.setImageBitmap(qrccode);
            }
        });

  @Override
    protected void onDestroy() {
        mVideoServer.stop();
        fileServer.stop();
        super.onDestroy();
    }

    }

手机端 或者网页端直接
http://10.67.13.209:8080/ 类似这种可以看到列表 然后点击可以下载资源

http://10.67.13.209:8080/storage/emulated/0/mo.xlsx

类似这种可以直接下载资源到本地

这个 视频播放 网页端播放视频流

我们N多年前对终端的数据做处理,增删改的操作可以这样做

  @Deprecated
    public Response serve(IHTTPSession session) {
        try {
            if (Method.POST.equals(session.getMethod())) {
                String uri = session.getUri();
                fields = session.getParms();
                session.parseBody(fields);
                String result = "";
                switch (uri) {
                    case "/SendQRPayAddress":
                        receiveAddress();
                        break;
                    case "/SendPlu":
                        receivePLU();
                        break;
                    case "/SendShopName":
                        receiveShopConfig();
                        break;
                    case "/GetTransaction":
                        result = sendTransaction();
                        break;
                    case "/GetTransactionDetail":
                        result = sendTransactionDetail();
                        break;
                    case "/GetPurchaseOrder":
                        result = sendPurchase();
                        break;
                    case "/DeleteAll":
                        dtManager.delete();
                        break;
                    case "/DeleteBySerialNum":
                        deleteTransactionBySerialNum();
                        break;
                    case "/DeleteByTradeTime":
                        deleteTransactionByTime();
                        break;
                    case "/DeleteTransactionByTime":
                        deleteTransaction();
                        break;
                    case "/SendSysTime":
                        DateUtil.setSystemDate(fields.get("Time"));
                        break;
                    case "/RestartApp":
                        restartApp();
                        break;
                    case "/SendUser":
                        receiveCustomer();
                        break;
                    case "/SendWebAddress":
                    case "/SendSettings":
                        receiveSettingConfig();
                        break;
                    case "/GetVersionName":
                        return new NanoHTTPD.Response("1," + App.VersionName + ";");
                    case "/DeleteSysLogByType":
                        deleteSysLogByType();
                        break;
                    case "/DeleteSysLogById":
                        deleteSysLogById();
                        break;
                    case "/DeletePurchaseById":
                        deletePurchaseByIds();
                        break;
                    case "/GetSysLog":
                        result = sendSysLog();
                        break;
                    default:
                        return new NanoHTTPD.Response("0,没有匹配的方法;");
                }
                return new NanoHTTPD.Response("1,OK;" + result);
            } else {
                return new NanoHTTPD.Response("0,no_post;");
            }
        } catch (Exception e) {
            CrashReport.postCatchedException(e);
            return new NanoHTTPD.Response("0," + "客户端错误:" + e.getMessage() + ";");
        }
    }

根据不同的url 做具体的也业务处理

这次有用到了,做个记录省的下次再查看,方便直接用到项目中

根据业务需要是一直开着,还是在适当的时候开启服务,自己看着处理

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值