| | |
| | | |
| | | 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 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); |
| | |
| | | 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(); |
| | | //获取传参参数 |
| | |
| | | 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); |
| | | // return newFixedLengthResponse("success"); |
| | | } 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("success"); |
| | | |
| | | } |
| | | return newFixedLengthResponse("404"); |
| | | } |
| | | |
| | | public static Response newFixedLengthResponse(String msg) { |
| | | return newFixedLengthResponse(Response.Status.OK, NanoHTTPD.MIME_HTML, 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); |
| | | } |
| | | |
| | | } |