`
fengshihao
  • 浏览: 50000 次
  • 性别: 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或其他格式的数据。 总结来说,这个压缩包...

    MTPA数值求解:双法探究,MTPA数值求解详解:两种方法的比较与应用探索,MTPA数值求解两种方法 ,MTPA数值求解; 方法一; 方法二;,MTPA数值求解的两种高效方法

    MTPA数值求解:双法探究,MTPA数值求解详解:两种方法的比较与应用探索,MTPA数值求解两种方法 ,MTPA数值求解; 方法一; 方法二;,MTPA数值求解的两种高效方法

    为什么你的switch总出bug?90%新手不知道的break语句隐藏规则.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    避坑指南:DeepSeekAPI常见错误代码解析与解决方案.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    视频缩略图生成组件,图像格式转换另存为jpg, png, gif, bmp格式

    'Function 生成视频缩略图(ByVal 视频文件 As String, ByVal 保存缩略图的文件路径 As String, Optional ByVal jpg图像品质 As Long = 80, _ ' Optional ByVal 缩略图宽度 As Long = 500, Optional ByVal 缩略图高度 As Long = 500 _ ' , Optional 返回图像实际宽度 As Long, Optional 返回图像实际高度 As Long) As Boolean Public Function SaveImageAs(LoadImgFile As String, ByVal SaveAsImgFile As String, _ Optional ByVal JpgQuality As Long = 80, Optional hPal As Long, Optional Resolution As Single) As Boolean

    浏览器插件开发:基于DeepSeekAPI的沉浸式翻译工具实战.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    bkall_answers(2).json

    bkall_answers(2).json

    从零实现多轮对话:DeepSeek上下文推理模式开发手册.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    安全防护全攻略:DeepSeekAPI密钥管理与请求限流最佳实践.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    实时对话系统构建:WebSocket长连接下的API稳定性保障方案.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    结构化输出进阶指南:深度解析DeepSeekAPI响应数据处理技巧.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    清华出品AI教程(15天熟练掌握DeepSeek)

    近日,一份由清华大学团队发布《DeepSeek:从入门到精通》的AI学习教程冲上了热搜,它是由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的余梦珑博士后及其团队倾力打造,从三个方面深入剖析了DeepSeek,DeepSeek是什么?有什么用?怎么使用? 详细论述了其应用场景与使用方法,并讲解了如何通过设计精妙的提示语来提升AI的使用效率,以及丰富的实例干货。 全部104页,完整版资料已经帮大家整理好了,免费领取 资料链接: https://pan.quark.cn/s/be3b500c539c

    异常处理大全:DeepSeekAPI调用中的10个常见错误与修复方案.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    冰点下载器珍藏版.zip

    冰点下载器珍藏版.zip

    Wallpaper Engine 壁纸一键提取

    Wallpaper Engine 是一款广受欢迎的动态壁纸软件,允许用户将各种动态、交互式壁纸应用到桌面上。其丰富的创意工坊内容让用户可以轻松下载和分享个性化的壁纸。而“一键提取”功能则是 Wallpaper Engine 中一个非常实用的工具,能够帮助用户快速提取和保存壁纸资源,方便后续使用或分享。

    基于碳达峰碳中和战略目标的城市园林绿化碳汇系统建设.pdf

    科研人员

    成本降低90%!DeepSeek与LangChain联动的API调用效率优化实验.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    13考试真题最近的t66.txt

    13考试真题最近的t66.txt

    对外承包项目借款合同2[示范文本].doc

    对外承包项目借款合同2[示范文本].doc

Global site tag (gtag.js) - Google Analytics