wjc
2025-05-07 5d3efa4c93dde0cde474951e5310bb72ebbf4184
app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java
@@ -4,11 +4,14 @@
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;
@@ -17,12 +20,12 @@
import fi.iki.elonen.NanoHTTPD;
/**
 * 本地服务器
 * 本地服务
 */
public class MyNanoHttpServer extends NanoHTTPD {
    //声明服务端 端口
    public static final Integer HTTP_PORT = 49152;
    public static Integer HTTP_PORT = 49152;// 46219;
    public MyNanoHttpServer(String hostname, int port) {
        super(hostname, port);
@@ -42,17 +45,21 @@
        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();
            //获取传参参数
@@ -60,38 +67,64 @@
            try {
                session.parseBody(params);
                String paramStr = params.get("postData");
                if (TextUtils.isEmpty(paramStr)) {
                    return newFixedLengthResponse("success");
                }
                paramStr = paramStr.replace("\r\n", " ");
                com.alibaba.fastjson.JSONObject jsonParam = JSON.parseObject(paramStr);
                Map<String, Object> result = new HashMap<>();
                //TODO 写你的业务逻辑.....
                //升级驱动文件路径
                String fileName = ((HTTPSession) session).getUri();
                String data = "";
                if (fileName.equals(HdlFileLogic.getInstance().getDriveRootPath())) {
                    data = HdlFileLogic.getInstance().readFile(fileName);
                }
                //响应客户端
                return newFixedLengthResponse(data);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ResponseException e) {
                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();
            String data = "";
            if (fileName.contains(HdlFileLogic.getInstance().getDriveRootPath())) {
                data = HdlFileLogic.getInstance().readFile(fileName);
            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(data);
            return newFixedLengthResponse("success");
        }
        return newFixedLengthResponse("404");
    }
@@ -122,8 +155,36 @@
         video/mp4:MP4 视频
         video/mpeg:MPEG 视频
         */
//        NanoHTTPD.Response response=new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "application/zip",inputStream,inputStream.available());
        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);
    }
}