<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      netty搭建http服務(wù)器

      public class HttpServerStart {
          public static volatile boolean flag = false ;
          public static void start() {
              int port = 8099;
              EventLoopGroup bossGroup = new NioEventLoopGroup();
              EventLoopGroup workerGroup = new NioEventLoopGroup();
              try {
                  ServerBootstrap b = new ServerBootstrap();
                  b.group(bossGroup, workerGroup)
                          .channel(NioServerSocketChannel.class)
                          .handler(new LoggingHandler(LogLevel.INFO))
                          .childHandler(new HttpServerInitializer())
                          .option(ChannelOption.SO_BACKLOG, 1024)
                          .childOption(ChannelOption.SO_KEEPALIVE, true);
      
                  Channel ch = b.bind(port).sync().channel();
                  System.out.println("httpserver服務(wù)成功啟動(dòng),請(qǐng)打開(kāi) http://127.0.0.1:" + port);
                  flag = true ;
                  ch.closeFuture().sync();
              } catch (InterruptedException e) {
                  e.printStackTrace();
              } finally {
                  bossGroup.shutdownGracefully();
                  workerGroup.shutdownGracefully();
              }
          }
      }
      public class HttpServerInitializer  extends ChannelInitializer<SocketChannel> {
          protected void initChannel(SocketChannel socketChannel) throws Exception {
              //HttpObjectAggregator HTTP 消息解碼器, 作用時(shí)將多個(gè)消息轉(zhuǎn)換為1個(gè)FullHttpRequest 或者 FullHttpResponse 對(duì)象
              /**
               * HttpRequestDecoder 會(huì)將每個(gè) HTTP 消息轉(zhuǎn)換為 多個(gè)消息對(duì)象
               * HttpResquest / HttpResponse
               * HttpContent
               * LastHttpContent
               */
              //將請(qǐng)求和應(yīng)答消息編碼或解碼為HTTP消息
              socketChannel.pipeline().addLast(new HttpRequestDecoder());
              socketChannel.pipeline().addLast(new HttpObjectAggregator(65536));// 目的是將多個(gè)消息轉(zhuǎn)換為單一的request或者response對(duì)象
              socketChannel.pipeline().addLast(new HttpResponseEncoder());
              socketChannel.pipeline().addLast(new ChunkedWriteHandler());//目的是支持異步大文件傳輸()
              socketChannel.pipeline().addLast("file-handler", new FileServerHandler());
              socketChannel.pipeline().addLast("handler", new HttpServerHandler(false));
          }
      }
      public class HttpServerHandler extends SimpleChannelInboundHandler<FullHttpRequest> {
      
          @Override
          public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
              ctx.flush();
          }
      
      
          public HttpServerHandler(boolean isAutoRelease){
              super(isAutoRelease);
          }
      
      
          protected void channelRead0(ChannelHandlerContext channelHandlerContext, FullHttpRequest request) throws Exception {
              try {
                  if(!request.decoderResult().isSuccess()){
                      DonkeyHttpUtil.writeResponse(request, BAD_REQUEST, channelHandlerContext);
                      return;
                  }
                  if(request.method() != HttpMethod.GET){
                      DonkeyHttpUtil.writeResponse(request, METHOD_NOT_ALLOWED, channelHandlerContext);
                      return;
                  }
                  DonkeyHttpUtil.writeResponse(request, OK, channelHandlerContext);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      
      
      
          @Override
          public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
              cause.printStackTrace();
              ctx.close();
          }
      }
      public class FileServerHandler extends SimpleChannelInboundHandler<FullHttpRequest> {
      
      
      
          protected void channelRead0(ChannelHandlerContext channelHandlerContext, FullHttpRequest request) throws Exception {
              //request.retain();
              HttpResponse response = null;
              RandomAccessFile randomAccessFile = null;
              try{
                  // 狀態(tài)為1xx的話,繼續(xù)請(qǐng)求
                  if (HttpHeaders.is100ContinueExpected(request)) {
                      send100Continue(channelHandlerContext);
                  }
                  String uri = request.uri();//   /digitalPlatform/common/common.js
                  if(!uri.endsWith(".js")
                          && !uri.endsWith(".css")
                          && !uri.endsWith(".html")
                          && !uri.endsWith(".png")
                          && !uri.endsWith(".jpg")
                          && !uri.endsWith(".gif")){
                      channelHandlerContext.fireChannelRead(request);
                      return;
                  }
                  uri = uri.substring(1);
                  InputStream input = MyApplication.getApplication().getAssets().open(uri);
                  File f = new File
                          (Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "cloudsapp"+File.separator+uri);
      
                  if (f.exists()) {
                      f.delete();
                  }else{
                      f.getParentFile().mkdirs();
                  }
                  f.createNewFile();
                  byte[] bytes = new byte[input.available()];
                  input.read(bytes);
      
                  OutputStream os = new FileOutputStream(f);
                  BufferedOutputStream bos = new BufferedOutputStream(os);
                  bos.write(bytes);
                  bos.flush();
                  bos.close();
      
                 try {
                      randomAccessFile = new RandomAccessFile(f, "r");
                  } catch (FileNotFoundException e) {
                      DonkeyHttpUtil.writeResponse(request, NOT_FOUND, channelHandlerContext);
                      e.printStackTrace();
                      return;
                  }
      
                  if(!f.exists() || f.isHidden()){
                      DonkeyHttpUtil.writeResponse(request, NOT_FOUND, channelHandlerContext);
                      return;
                  }
                  long fileLength = randomAccessFile.length();
                  response = new DefaultHttpResponse(request.protocolVersion(), HttpResponseStatus.OK);
      
                  setContentType(response, f);
                  boolean keepAlive =  HttpUtil.isKeepAlive(request);
                  if (keepAlive) {
                      response.headers().set(HttpHeaderNames.CONTENT_LENGTH, fileLength);
                      response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
                  }
                  channelHandlerContext.write(response);
      
      
                  ChannelFuture sendFileFuture = channelHandlerContext.write(new ChunkedNioFile(randomAccessFile.getChannel()), channelHandlerContext.newProgressivePromise());
                  // 寫(xiě)入文件尾部
                  sendFileFuture.addListener(new ChannelProgressiveFutureListener() {
                      @Override
                      public void operationProgressed(ChannelProgressiveFuture future,
                                                      long progress, long total) {
                          if (total < 0) { // total unknown
                              System.out.println("Transfer progress: " + progress);
                          } else {
                              System.out.println("Transfer progress: " + progress + " / "
                                      + total);
                          }
                      }
      
                      @Override
                      public void operationComplete(ChannelProgressiveFuture future)
                              throws Exception {
                          System.out.println("Transfer complete.");
                      }
      
      
                  });
                  ChannelFuture lastContentFuture =  channelHandlerContext.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
                  if (!keepAlive) {
                      lastContentFuture.addListener(ChannelFutureListener.CLOSE);
                  }
              }catch (Exception e){
                  DonkeyHttpUtil.writeResponse(request, NOT_FOUND, channelHandlerContext);
                  e.printStackTrace();
              }finally {
                  if(randomAccessFile != null){
                      try {
                          randomAccessFile.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }else{
                      DonkeyHttpUtil.writeResponse(request, NOT_FOUND, channelHandlerContext);
                  }
              }
          }
      
      
          public static void writeBytesToFile(InputStream is, File file) throws IOException{
              FileOutputStream fos = null;
              try {
                  byte[] data = new byte[2048];
                  int nbread = 0;
                  fos = new FileOutputStream(file);
                  while((nbread=is.read(data))>-1){
                      fos.write(data,0,nbread);
                  }
              }
              catch (Exception ex) {
                  Log.e("Exception",ex.getMessage());
              }
              finally{
                  if (fos!=null){
                      fos.close();
                  }
              }
          }
          private void setContentType(HttpResponse response, File file){
              //MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();
              if(file.getName().endsWith(".js")){
                  response.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/x-javascript");
              }else if(file.getName().endsWith(".css")){
                  response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/css; charset=UTF-8");
              }else if (file.getName().endsWith(".html")){
                  response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html; charset=UTF-8");
              }
          }
          @Override
          public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
              cause.printStackTrace();
              ctx.close();
          }
      
          private static void send100Continue(ChannelHandlerContext ctx) {
              FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE);
              ctx.writeAndFlush(response);
          }
      }
      public class DonkeyHttpUtil {
      
      
          public static boolean writeResponse(FullHttpRequest request, HttpResponseStatus status, ChannelHandlerContext ctx) {
              // Decide whether to close the connection or not.
              boolean keepAlive = HttpUtil.isKeepAlive(request);
              // Build the response object.
              FullHttpResponse response = new DefaultFullHttpResponse(request.protocolVersion(), status,
                      Unpooled.copiedBuffer(status.toString(), CharsetUtil.UTF_8));
              response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8");
              if (keepAlive) {
                  // Add 'Content-Length' header only for a keep-alive connection.
                  response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
                  // Add keep alive header as per:
                  response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
              }
      
              // Encode the cookie.
              String cookieString = request.headers().get(HttpHeaderNames.COOKIE);
              if (cookieString != null) {
                  Set<io.netty.handler.codec.http.cookie.Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieString);
                  if (!cookies.isEmpty()) {
                      // Reset the cookies if necessary.
                      for (io.netty.handler.codec.http.cookie.Cookie cookie : cookies) {
                          response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.STRICT.encode(cookie));
                      }
                  }
              }
              // Write the response.
              ctx.write(response);
              return keepAlive;
          }
      }

       

      posted @ 2021-03-09 16:13  冬天不眠  閱讀(359)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲国产精品综合久久网络| 人人玩人人添人人澡超碰| 一亚洲一区二区中文字幕| 久久人与动人物a级毛片| 亚洲欧美日韩一区在线观看| 久久综合狠狠综合久久激情| 色老头亚洲成人免费影院| 亚欧成人精品一区二区乱| 国产精品久久久久7777| 久热这里只有精品在线观看| 久久综合久中文字幕青草| 2021最新国产精品网站| 国产精品久久久久久久久鸭| 国产精品中文av专线| 株洲县| 国产蜜臀视频一区二区三区| 欧美福利电影A在线播放| 国产xxxx做受视频| 日本久久久久亚洲中字幕| 国产高清在线男人的天堂| 中文毛片无遮挡高潮免费| 无码福利写真片视频在线播放| 亚洲av无码精品蜜桃| 国产精品久久久久久福利69堂| 亚洲熟女国产熟女二区三区| av中文字幕国产精品| 亚洲av色香蕉一二三区| 久久久久成人精品免费播放动漫| 亚洲大尺度一区二区av| 漂亮人妻中文字幕丝袜| 安福县| 精品熟女少妇免费久久| 99久久久国产精品消防器材| 久久精品女人天堂av免费观看 | 鄂托克前旗| 日韩精品 在线一区二区| 日韩精品一区二区午夜成人版| 国产激情无码一区二区三区| 精品免费看国产一区二区| 亚洲a免费| 国产一区精品综亚洲av|