XlightWeb 的使用
本文目的学会使用HttpClient ,同步请求方式, 异步请求方式, timeout设置预处理,发送大数据。
1
XlightWeb是基于xsockets的使用了NIO的框架。
XlightWeb可以构建同步阻塞的或者异步非阻塞的http客户端和http服务器。
2 先看客户端的构建
HttpClient
这幅图的含义是: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
框架图
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的时间间隔最长是多少。
设置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.
相关推荐
不知道是不是最新的,这是我找的最高版本。 如果有更高的版本,告诉我一下
通常,使用xsocket或xlightweb时,你需要在服务器端创建WebSocket服务器,并监听特定端口,然后在客户端创建WebSocket对象并连接到服务器。之后,你可以发送和接收JSON或其他格式的数据。 总结来说,这个压缩包...
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
基于java的学生网上请假系统的开题报告.docx
社会经济繁荣发展的今天,电子商务得到了飞速发展,网上交易越来越彰显出其独特的优越性,在人们的日常生活中,出现了各种类型的交易网站。其中一个就是车辆易主交易网站,它是一个服务于用户买卖二手车辆的交易网站,为用户提供了平等互利、方便快捷的网上交易平台,通过这一类型的网站,用户可自由出售和购买车辆。 本课题主要根据车辆本身的特性,充分发挥互联网的特点与优势,构建一个以二手车辆为商品、基于互联网平台的车辆易主业务交易管理系统,并根据车辆易主业务交易管理系统的应用需求,进行需求分析,进而对网站系统作规划设计。采用IDEA为运行平台,以SSH为框架,运用HTML语言、JSP技术、MySql数据库、JSP与后台数据库链接等关键技术建设二手车网上交易系统,构建车辆易主交易系统的会员注册与登录,网站首页展示、用户发布商品车辆,用户求购商品车辆,分页浏览、购物系统、用户后台管理、管理员用户后台管理等功能,并使这些功能得以实现并更好为用户服务。网站整体构建完成且测试成功后,用户可以进入网站进行注册、登录,登录后,用户可以在网站上发布自己的闲置车辆或者寻找想要购买的车辆,还可以收藏车辆,管理发布和收藏的车辆,