package com.hdl.photovoltaic.internet.HttpServer; 
 | 
  
 | 
import android.text.TextUtils; 
 | 
  
 | 
import com.alibaba.fastjson.JSON; 
 | 
import com.hdl.photovoltaic.other.HdlFileLogic; 
 | 
import com.hdl.photovoltaic.other.HdlLogLogic; 
 | 
  
 | 
  
 | 
import java.io.BufferedInputStream; 
 | 
import java.io.ByteArrayInputStream; 
 | 
import java.io.FileInputStream; 
 | 
import java.io.IOException; 
 | 
import java.nio.charset.StandardCharsets; 
 | 
import java.util.Date; 
 | 
import java.util.HashMap; 
 | 
import java.util.List; 
 | 
import java.util.Map; 
 | 
  
 | 
import fi.iki.elonen.NanoHTTPD; 
 | 
  
 | 
/** 
 | 
 * 本地服务 
 | 
 */ 
 | 
public class MyNanoHttpServer extends NanoHTTPD { 
 | 
  
 | 
    //声明服务端 端口 
 | 
    public static Integer HTTP_PORT = 49152;// 46219; 
 | 
  
 | 
    public MyNanoHttpServer(String hostname, int port) { 
 | 
        super(hostname, port); 
 | 
    } 
 | 
  
 | 
    private volatile static MyNanoHttpServer myNanoHttpServer; 
 | 
  
 | 
    //TODO    单例模式,获取实例对象,并传入当前机器IP 
 | 
    public static MyNanoHttpServer getInstance(String ipAddress) { 
 | 
        if (myNanoHttpServer == null) { 
 | 
            synchronized (MyNanoHttpServer.class) { 
 | 
                if (myNanoHttpServer == null) { 
 | 
                    myNanoHttpServer = new MyNanoHttpServer(ipAddress, HTTP_PORT); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return myNanoHttpServer; 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public Response serve(IHTTPSession session) { 
 | 
        //TODO  解决客户端请求参数携带中文,出现中文乱码问题 
 | 
        ContentType ct = new ContentType(session.getHeaders().get("content-type")).tryUTF8(); 
 | 
        session.getHeaders().put("content-type", ct.getContentTypeHeader()); 
 | 
        return dealWith(session); 
 | 
  
 | 
    } 
 | 
  
 | 
  
 | 
    private Response dealWith(IHTTPSession session) { 
 | 
        Date dateTime = new Date(); 
 | 
        if (Method.POST == session.getMethod()) { 
 | 
            //todo POST方法 
 | 
            //获取请求头数据 
 | 
            Map<String, String> header = session.getHeaders(); 
 | 
            //获取传参参数 
 | 
            Map<String, String> params = new HashMap<String, String>(); 
 | 
            try { 
 | 
                session.parseBody(params); 
 | 
                String paramStr = params.get("postData"); 
 | 
                //响应客户端 
 | 
                return newFixedLengthResponse("success"); 
 | 
            } catch (IOException | ResponseException e) { 
 | 
                e.printStackTrace(); 
 | 
            } 
 | 
            return newFixedLengthResponse("success"); 
 | 
        } else if (Method.GET == session.getMethod()) { 
 | 
            //todo GET方法 
 | 
            Map<String, List<String>> parameters = session.getParameters(); 
 | 
            //驱动升级文件路径 
 | 
            String fileName = ((HTTPSession) session).getUri(); 
 | 
            if (!TextUtils.isEmpty(fileName)) { 
 | 
                if (fileName.contains(HdlFileLogic.getInstance().getDriveRootPath()) 
 | 
                        || fileName.contains(HdlFileLogic.getInstance().getFirmwareRootPath())) { 
 | 
                    String range = session.getHeaders().get("range"); 
 | 
                    if (TextUtils.isEmpty(range)) { 
 | 
                        return newFixedLengthResponse("错误,头部没有range字段(-500)"); 
 | 
                    } 
 | 
                    HdlLogLogic.print("http逆变器请求===请求大小-->" + range, true); 
 | 
                    if (!range.contains("=")) { 
 | 
                        HdlLogLogic.print("错误,range的value格式不对.(-501)", true); 
 | 
                        return newFixedLengthResponse("错误,range的value格式不对.(-501)"); 
 | 
                    } 
 | 
                    String[] bytesAry = range.split("="); 
 | 
                    if (bytesAry.length < 2) { 
 | 
                        HdlLogLogic.print("错误,range的value格式不对.(-502)", true); 
 | 
                        return newFixedLengthResponse("错误,range的value格式不对.(-502)"); 
 | 
                    } 
 | 
                    String[] dataIndex = bytesAry[1].split("-"); 
 | 
                    if (dataIndex.length < 2) { 
 | 
                        HdlLogLogic.print("错误,range的value格式不对.(-503)", true); 
 | 
                        return newFixedLengthResponse("错误,range的value格式不对.(-503)"); 
 | 
                    } 
 | 
                    int startIndex = Integer.parseInt(dataIndex[0]); 
 | 
                    int endIndex = Integer.parseInt(dataIndex[1]); 
 | 
                    if (endIndex + 1 - startIndex <= 0) { 
 | 
                        HdlLogLogic.print("错误,请求大小有问题.(-504)", true); 
 | 
                        return newFixedLengthResponse("错误,请求大小有问题.(-504)"); 
 | 
                    } 
 | 
                    //读取本地文件字节流 
 | 
                    byte[] sourceDataByte = HdlFileLogic.getInstance().readFileByte(fileName); 
 | 
                    if (sourceDataByte == null || sourceDataByte.length == 0) { 
 | 
                        HdlLogLogic.print("错误,本地找不到文件,请下载再试.(-505)", true); 
 | 
                        return newFixedLengthResponse("错误,本地找不到文件,请下载再试.(-505)"); 
 | 
                    } 
 | 
                    //根据请求大小创建缓存区 
 | 
                    byte[] newByte = new byte[endIndex - startIndex + 1]; 
 | 
                    //根据请求偏移量取数据,且复制到缓存区 
 | 
                    System.arraycopy(sourceDataByte, startIndex, newByte, 0, endIndex + 1 - startIndex); 
 | 
                    //响应客户端 
 | 
                    Response response = newFixedLengthResponse(newByte); 
 | 
                    response.addHeader("Content-Range", range + "/" + sourceDataByte.length);//伟南需要这个字段 
 | 
                    HdlLogLogic.print("http回复数据===请求大小--" + range + "=====文件大小--" + sourceDataByte.length, true); 
 | 
                    return response; 
 | 
                } 
 | 
            } 
 | 
            return newFixedLengthResponse("success"); 
 | 
  
 | 
        } 
 | 
        return newFixedLengthResponse("404"); 
 | 
    } 
 | 
  
 | 
    public static Response newFixedLengthResponse(String msg) { 
 | 
  
 | 
        /** 
 | 
         文本类型: 
 | 
         text/plain:纯文本 
 | 
         text/html:HTML 文档 
 | 
         text/css:CSS 样式表 
 | 
         text/javascript:JavaScript 脚本 
 | 
         应用程序类型: 
 | 
         application/json:JSON 数据 
 | 
         application/xml:XML 数据 
 | 
         application/pdf:PDF 文档 
 | 
         application/octet-stream:二进制数据流 
 | 
         application/x-www-form-urlencoded:URL 编码的表单数据 
 | 
         application/zip:ZIP 压缩文件 
 | 
         application/x-gzip:GZIP 压缩文件 
 | 
         图片类型: 
 | 
         image/jpeg:JPEG 图像 
 | 
         image/png:PNG 图像 
 | 
         image/gif:GIF 图像 
 | 
         image/svg+xml:SVG 图像 
 | 
         音频/视频类型: 
 | 
         audio/mpeg:MP3 音频 
 | 
         video/mp4:MP4 视频 
 | 
         video/mpeg:MPEG 视频 
 | 
         */ 
 | 
        return newFixedLengthResponse(Response.Status.OK, "application/octet-stream", msg); 
 | 
    } 
 | 
  
 | 
    public static Response newFixedLengthResponse(byte[] by) { 
 | 
  
 | 
        /** 
 | 
         文本类型: 
 | 
         text/plain:纯文本 
 | 
         text/html:HTML 文档 
 | 
         text/css:CSS 样式表 
 | 
         text/javascript:JavaScript 脚本 
 | 
         应用程序类型: 
 | 
         application/json:JSON 数据 
 | 
         application/xml:XML 数据 
 | 
         application/pdf:PDF 文档 
 | 
         application/octet-stream:二进制数据流 
 | 
         application/x-www-form-urlencoded:URL 编码的表单数据 
 | 
         application/zip:ZIP 压缩文件 
 | 
         application/x-gzip:GZIP 压缩文件 
 | 
         图片类型: 
 | 
         image/jpeg:JPEG 图像 
 | 
         image/png:PNG 图像 
 | 
         image/gif:GIF 图像 
 | 
         image/svg+xml:SVG 图像 
 | 
         音频/视频类型: 
 | 
         audio/mpeg:MP3 音频 
 | 
         video/mp4:MP4 视频 
 | 
         video/mpeg:MPEG 视频 
 | 
         */ 
 | 
        return newFixedLengthResponse(NanoHTTPD.Response.Status.OK, "application/octet-stream", new ByteArrayInputStream(by), by.length); 
 | 
    } 
 | 
  
 | 
} 
 |