`
fengshihao
  • 浏览: 49898 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XlightWeb 的使用

    博客分类:
  • java
阅读更多

XlightWeb 的使用


本文目的学会使用HttpClient ,同步请求方式, 异步请求方式, timeout设置预处理,发送大数据。

1  XlightWeb是基于xsockets的使用了NIO的框架。
   XlightWeb可以构建同步阻塞的或者异步非阻塞的http客户端和http服务器。


2 先看客户端的构建
   HttpClient
    
HttpClient.gif
这幅图的含义是:HttpClient 实现了 IHttpClientEndpoint接口,里边含有若干HttpClientConnection。
而 HttpClientconnection实现了INonBlockingConnection的tcp链接。 也就是说HttpClient是一个非阻塞
的连接池。
    示例1 用call方法发送请求  
    HttpClient httpClient = new HttpClient();

   //设置一些httpclient的属性
   httpClient.setFollowsRedirect(true);  
   httpClient.setAutoHandleCookies(false);
 
   //生成request
   IHttpRequest request = new GetRequest("http://www.sohu.com");
   //设置request属性
   request.setHeader("Accept-Encoding", "gzip,deflate");
   
   //call方法是同步方法,知道收到http头后才返回,这个方法会阻塞在这里。
   //这里也可以用非阻塞的方式send方法访问 下边示例介绍
   HttpResponse response =   (HttpResponse)httpClient .call(request);
   System.out.println(response.getResponseHeader());

   //获得http头后,http的body并没有收完,可以用response获得BlockingBodyDataSource 
   //或者 NonBlockingBodyDataSource 这里用了阻塞同步的方式
   BlockingBodyDataSource bodyDataSource = response.getBlockingBody() ;
   String data = bodyDataSource.readString( ); 
   System.out.println(data);
   httpClient.close();

  
    示例2 加入 Interceptor 
    Interceptor 允许程序在发送request的是后就是调用call方法之后,call方法返回之前,做一些处理,如
   把这个request记录在日志上。上边代码加入如下一句:
    
     .......
    httpClient.addInterceptor(new HeaderLogFilter());
    ..... .

    //最为一个interceptor 要实现 IHttpRequestHandler 接口的onRequest方法
    class HeaderLogFilter implements IHttpRequestHandler {

              public void onRequest(final IHttpExchange exchange) throws IOException {
                 System.out.println("-------------------intercepter onRequest----------------"); 
                 System.out.println(exchange.getRequest().getRequestHeader());
                 exchange.forward(exchange.getRequest());
           }
        

    示例3 自动重试  
   
     GET DELETE PUT 方法是幂等的,所以多次一样的请求服务器不会出现问题,例如get一个资源失败后再次get
    服务器可以返回一样的结果。默认情况下HttpClient在请求失败后不会自动重试,需要设置 setCallReturnOnMessage
  
     HttpClient httpClient = new HttpClient(); 
     httpClient.setCallReturnOnMessage(true); 
     IHttpResponse response = httpClient.call(new GetRequest("http://www.sohu.com"))

    示例4 HttpClient 异步send方式
    使用异步的方式有两种 一种是使用FutureResponse 一种是使用 send方法指定ResponseHandler。
    这里介绍第二种使用handler

    ......
    //发送请求时生成一个handler 来处理将来的返回
    httpClient.send(request, new MyResponseHandler());
    .....

    //实现 IHttpResponseHandler  接口的Handler
     @Execution(Execution.MULTITHREADED)
      class MyResponseHandler implements IHttpResponseHandler {

            @InvokeOn(InvokeOn.MESSAGE_RECEIVED)
           public void onResponse(IHttpResponse response) throws IOException {
              System.out.println("-------------------Handler onResponse----------------");
              System.out.println(response.getResponseHeader());
           }

           public void onException(IOException ioe) {
              System.out.println("error occured by receiving response " + ioe.toString());
           }
     }

    这里需要注意的是两个 Annotation 。
      Execution    两个参数值  MULTITHREADED 指明回调将在一个线程里完成, NONTHREADED指明回调在I/O主线程完成
    InvokeOn   连个参数 MESSAGE_RECEIVED 回调再收到body之后发生, HEADER_RECEIVED 在收到http头时发生 

    关于 Execution    的更多信息 参考 xSocket 框架图

    architecture.gif

    The Dispatcher (I/O thread) is responsible to perform the socket read & write I/O operations and to delegate the call back handling. By default number of CPUs + 1  dispatchers will be created. A connection is bound to one dispatcher during the total lifetime.
     xSocket uses the worker pool only to perform the handler's call back method. The pool can be set by calling the appropriate setter method. A worker pool has to implement the java.util.concurrent.Executor interface. 

   xSocket 底层有个IO线程负责Connection的读写,IO线程个数为cpu个数+1 ,而handler回调是由一个线程池来处理,
    每个connection是绑定在一个IO线程上的。  所以如果把回调放入到IO线程中处理时 一定注意能有异常和阻塞方法调用。
   否则会只是整个IO线程阻塞。

   示例5 处理timeout
   有三种timeout类型可以设置,各个类型代表的时间如图

  • ConnectionTimeout : 获得链接的时间限制
  • ResponseTimeout : 获得响应的时间限制, 从send到获得header的时间。
  • BodyDataReceiveTimeout : 获取body的时间间隔最长是多少。
ResponseTimeout.gif
    设置timeout
     httpClient .setConnectionTimeoutMillis(24L * 60L * 60L * 1000L); 
     httpClient .setResponseTimeoutMillis(2L * 60L * 1000L); 
     httpClient .setBodyDataReceiveTimeoutMillis(30L * 1000L);

    timeout的处理
     使handler实现接口 IHttpSocketTimeout  的 onException(SocketTimeoutException stoe) 方法
    class MyHandler implements IHttpResponseHandler, IHttpSocketTimeoutHandler { 
               public void onResponse(IHttpResponse response) throws IOException { // ... } 
               public void onException(IOException ioe) { // ... } 
               public void onException(SocketTimeoutException stoe) { // response timeout occured //} 
               }
     
  示例6 异步使用流方式发送request的body
    这种方法在上传文件等发送大数据的时候很有用。
    1  因为body比较大 所以先把reqeust的header 和 body的length发送出去
    2 打开文件构建 FileChannel 然后用 BodyDataSink  传送。 BodyDataSink来自send函数返回
     // create a response handler
     IHttpResponseHandler hdl = new MyResponseHandler();

     // get the file to transfer
     RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
     FileChannel fc = raf.getChannel();
     int bodyLength = (int) fc.size();      

     // 先构建header发送
     IHttpRequestHeader header = new HttpRequestHeader("POST", "http://server:80/in", "text/plain");

     // 如果指定了bodylength 那么就会用非chunk的方式传送数据
     BodyDataSink bodyDataSink = httpClient.send(header, bodyLength, hdl);

     // 这里存在一个同步异步的问题
     bodyDataSink.transferFrom(fc);

     // finish the send procedure
     bodyDataSink.close();
    
   
    这里需要改进一下发送数据时的方式,默认情况下BodyDataSink是同步发送的,也就是把文件里的数据同步自动写入到了
   底层的IO中,这里会造成效率的地下。需要设置为异步的 改动如下

     bodyDataSink.setAutoflush(false);            // 取消自动写入
     bodyDataSink.setFlushmode(FlushMode.ASYNC);  // 设置为异步方式

     // 写入数据 
     bodyDataSink.write(bytebuffer);
   //手动flush到底层IO
     bodyDataSink.flush();

   同时要注意,write时候的bytebuffer 不能重用。 如果需要重复使用write时候的bytebuffer  会造成和底层内部IO线程的竞争,致使数据坏掉。如下摘抄自Xsocket

   By using the  WritableByteChannel  interface methods write(ByteBuffer) and write(ByteBuffer[]) some restriction exits. Calling such a write method in mode ASYNC causes that the byte buffer will be read asynchronously by the internal I/O thread. If the byte buffer will be accessed (reused) after calling the write method, race conditions will occur. The write(ByteBuffer) and write(ByteBuffer[]) should only called in ASYNC mode, if the byte buffer will not be accessed (reused) after the write operation.

4
1
分享到:
评论
2 楼 yunlong167167 2014-07-03  
1234567890
1 楼 jd2bs 2011-03-04  
翻译的不错  跟原文对照看  有收获 呵呵

相关推荐

    xLightweb2.13.2.jar

    不知道是不是最新的,这是我找的最高版本。 如果有更高的版本,告诉我一下

    ws(websocket)例子(xsocket\xlightweb)

    通常,使用xsocket或xlightweb时,你需要在服务器端创建WebSocket服务器,并监听特定端口,然后在客户端创建WebSocket对象并连接到服务器。之后,你可以发送和接收JSON或其他格式的数据。 总结来说,这个压缩包...

    基于纯verilogFPGA的双线性差值视频缩放 功能:利用双线性差值算法,pc端HDMI输入视频缩小或放大,然后再通过HDMI输出显示,可以任意缩放 缩放模块仅含有ddr ip,手写了 ram,f

    基于纯verilogFPGA的双线性差值视频缩放 功能:利用双线性差值算法,pc端HDMI输入视频缩小或放大,然后再通过HDMI输出显示,可以任意缩放。 缩放模块仅含有ddr ip,手写了 ram,fifo 代码,可以较为轻松地移植到其他平台。 硬件平台:易灵思 ti60f225 EDA平台:efinity

    【java毕业设计】智慧社区智慧社区管理员密码修改与重置系统(源代码+论文+PPT模板).zip

    zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。

    基于51单片机的一个智能密码锁设计.7z

    基于51单片机的一个智能密码锁设计.7z

    《STM32单片机+2x180-SG90+2x360-SG90+OLED屏幕》源代码

    《基于STM32的舵机控制系统设计》毕业设计项目 1.STM32单片机+2x180_SG90+2x360_SG90+OLED屏幕 2.OLED屏幕显示舵机的方向、速度、角度各项数据 3.按键1:控制180度舵机正向转动角度      4.按键2:控制180度舵机反向转动角度 5.按键3:控制360度舵机正向转动并且控制舵机速度      6.按键4:控制360度舵机反向转动并且控制舵机速度 7.代码里面含有注释 8.硬件实物接上线就能直接运行

    pyside6-qml-modern-uiapp

    Pyside6+Qml+QtCreator做的桌面app

    基于深度堆叠卷积神经网络的图像融合详细文档+全部资料+优秀项目+源码.zip

    【资源说明】 基于深度堆叠卷积神经网络的图像融合详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    基于卷积神经网络的语音识别声学模型的研究详细文档+全部资料+优秀项目+源码.zip

    【资源说明】 基于卷积神经网络的语音识别声学模型的研究详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    IndexOutOfBoundsException(解决方案).md

    IndexOutOfBoundsException(解决方案)

    Mini-Imagenet数据集文件

    Mini-Imagenet数据集文件

    时间转换工具(BD时、GPS时、UTC时、北京时间相互转换,可计算日期)

    时间转换工具(BD时、GPS时、UTC时、北京时间相互转换,可计算日期)

    基于CNN神经网络实现的正方教务系统的验证码识别资料齐全+高分项目+文档+源码.zip

    【资源说明】 基于CNN神经网络实现的正方教务系统的验证码识别资料齐全+高分项目+文档+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    西北工业大学 人工智能程序设计 Python NOJ程序源代码.zip

    西北工业大学 人工智能程序设计 Python NOJ程序源代码.zip

    车辆、飞机、船检测12-YOLO(v5至v11)、COCO、CreateML、TFRecord、VOC数据集合集.rar

    车辆、飞机、船检测12-YOLO(v5至v11)、COCO、CreateML、TFRecord、VOC数据集合集.rar对象检测分配-V2 2024-03-10 7:04 pm ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括2992张图像。 以可可格式注释船舶飞机。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 没有应用图像增强技术。

    基于SpringBoot2/3+Sa-Token+Mybatis-Plus和Vue3+Ant Design Vue+Uni-App+Uni-UI,并以高质量代码为核心,简洁、高效、安全的快速开发平台

    SmartAdmin以「高质量代码」为核心,「简洁、高效、安全」的快速开发平台;基于SpringBoot2/3+Sa-Token+Mybatis-Plus和Vue3 +Ant Design Vue+UniApp (提供JavaScript和TypeScript双版本、Java8和java17双版本);满足三级等保、网络安全、数据安全等功能要求。并重磅开源千余家企业在使用的《高质量代码规范》等

    计算机语言学中并查集数据结构的C++实现

    欢迎下载

    jsp基于WEB操作系统课程教学网站的设计与实现(源代码+论文)(2024i6).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    基于常规波束形成的时间窗方法以及基于卷积神经网络的时间窗方法水下目标方位估计算法详细文档+全部资料+优秀项目+源码.zip

    【资源说明】 基于常规波束形成的时间窗方法以及基于卷积神经网络的时间窗方法水下目标方位估计算法详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    html+css网页设计 美食 蛋糕美食7个页面

    预览地址:https://blog.csdn.net/qq_42431718/article/details/144633992 html+css网页设计 美食 蛋糕美食7个页面

Global site tag (gtag.js) - Google Analytics