Vert.x学习第一天
昨天看了下异步,然后就开始了Vert.x相关知识的学习。
Vert.x是当下非常流行的一套全异步框架,其优势在于轻量级、高效。非常适合作为移动端后台或是企业应用。
当然对于第一天接触这个框架的人(没错,正是在下)来说,Vert.x一些独特的特性还不是现在了解的时候,对着说明文档去码一些demo才是正道。
首先我们先建一个gradle项目,然后在build.gradle中的dependencies中添加 compile 'io.vertx:vertx-core:3.5.0' (下载jar包),之后在build.gradle文件的最后添加 task copyJars(type: Copy) { from configurations.runtime into 'lib' } (下载到lib文件夹,这个文件夹自己在项目下新建一个)
如果使用的是idea的话,可以双击我们新添加的copyJar运行(如下图),这样jar包就下载好了,或者在cmd中进入到build.gradle所在文件夹中,使用语句 gradle copyJar 也可以。

添加好jar包之后就可以写一个test类了。
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpServerResponse;
import javafx.application.Application;
import javafx.stage.Stage; public class test extends Application{ @Override
public void start(Stage primaryStage) throws Exception {
Vertx.vertx().createHttpServer().requestHandler(req -> {
HttpServerResponse response=req.response();
System.out.println("lodaing");
response.setChunked(true);
response.write("aaaa");
response.end();
}).listen(8889,"localhost"); }
}
这是一个最简单服务器代码,实现的作用是:每当有对localhost这个主机8889端口的请求,便会响应“aaaa”字符串。
这个test类继承了Application,然后实现了Application的start()方法。(Application继承自AbstractVerticle,如果test类继承AbstractVertical同样可以实现这个功能,但是要写一个main方法调用start方法。AbstractVerticle和Application的区别我还没有具体的看,但是Application的start()方法是会自动调用的)
Vertx.vertx() 返回一个Vertx对象,这个对象可以使用 createHttpServer() 来创建一个服务器对象,我这里用链式直接写了,为了方便理解,我们可以把这个服务器对象单独拿出来 HttpServer server=Vertx.vertx().createHttpServer();
我们可以给这个服务器对象server添加一个监听 server.listen(8889,"localhost") ,这两个参数不写的话,端口默认是80,主机地址默认是0.0.0.0。这样,每当有对localhost的8889端口的请求,都会被这个服务器监听到。
如果我想在监听到一个请求之后,让服务器做出一些响应,那么我们就应该使用 server.requestHandler() ,requestHandler()里面有一个Handler对象,这里使用lambda表达式来写这个匿名内部类。总之,我们传入了一个HttpRequest类型的req进去,这个req就是被我们监听到的请求。 req.response() 创建了一个对当前请求的响应对象,通过这个响应对象,我们使用write()方法可以一个响应字符串。这里要注意的是,使用write()方法之前必须指定要发送的信息的长度。或者用 response.setChunked(true); 来指定要发送的信息是分块发送。指定分块发送的信息不需要指定长度,但是需要在write()之后使用 response.end(); 来表示我要写的信息已经结束啦,这样服务器才会把要响应的信息发送回去。还有一种返回字符串的方法可以省略write(),就是直接在end()里面添加字符串,但是只能发送一次,再次response.end("sdasd");就会报错。
写好了以上的代码之后,我们运行代码,然后在浏览器中输入地址“localhost:8889”就可以看到响应的字符串出现在浏览器上了。因为我们监听的是8889端口所有的请求,所以“localhost:8889/asda/asdas/fasf”这样的地址也会返回同样的结果。
以上只是最最简单的一个例子,上面的代码并没有去分析请求中的信息,只是得到请求就响应了。下面写一些从请求中得到信息的方法:
req.version() //得到请求的版本信息,如HTTP1.1
req.method() //得到请求的方式,如GET、POST
req.path() //得到请求的地址,如“localhost:8080/user/hello.html?id=1&pwd=123”得到的结果是 “/user/hello.html”部分
req.uri() //得到请求的数据部分,得到的结果是“id=1&pwd=123”部分
req.absoluteURI() //返回完整地址,“http://“localhost:8080/user/hello.html?id=1&pwd=123”
Vertx因为是异步的,在一个请求到达时,它会先接受请求头部信息(head),不用等待body到来就可以处理请求。所以上面的方法只可以得到请求头的数据。如果想要读取body中的信息(如post方式传递的数据),可以用以下方法:
req.setExpectMultipart(true); //告诉服务器,我要读取body信息
req.endHandler(v->{
MultiMap fa=req.formAttributes();//从req中读取body所有信息并存储到MultiMap对象中
System.out.println(fa.entries().toString()); //entries()方法会返回一个list格式的数据,MultiMap类型的数据具体怎么读我还没仔细研究
});
为了验证,我写了一个web 表单,来验证功能:(webroot/index2.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/user" method="post">
<input type="text" name="name" id="name" value="hellooooo"/>
<input type="submit" name="submit" id="submit" value="submit"/>
</form>
</body>
</html>
(SAndC.Servert.java如下:)
package SAndC; import io.vertx.core.MultiMap;
import io.vertx.core.Vertx;
import javafx.application.Application;
import javafx.stage.Stage; public class Server extends Application{ @Override
public void start(Stage primaryStage) throws Exception {
Vertx.vertx().createHttpServer().requestHandler(req->{
if(!req.path().equals("/webroot/index2.html")){
req.response().end("i get the message!\n"+req.version()+"\n"+req.method()+"\n"+req.path()+"\n");
req.setExpectMultipart(true);
req.endHandler(v->{
MultiMap fa=req.formAttributes();
System.out.println(fa.entries().toString());
System.out.println(req.absoluteURI());
});
}else{
req.response().sendFile("webroot/index2.html");
}
}).listen(8080,"localhost",res->{
if(res.succeeded()){
System.out.println("Server is now listening!");
}else{
System.out.println("I wangt to listen but failed!");
}
});
}
}
上面的功能是:接收到一个一个请求后,判断请求路径是不是/webroot/index2.html,如果是,就返回index2.html这个页面,这样我们就能看到自己的表单了。
然后,index2.html中表单的action我是随便填的,反正都会被监听到,这样提交的数据就是post方式,请求的body中会包含name和submit的数据。
点击提交之后,判断路径不是/webroot/index2.html,所以读取请求的body信息,结果如下:

Vert.x学习第一天的更多相关文章
- Magento学习第一课——目录结构介绍
Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...
- YII2学习第一天
YII2学习第一天,之前稍微看了看TP,感觉和自己的理念不是很符合,然后转学YII2了. 使用的文档是https://github.com/yiisoft/yii2/tree/master/docs/ ...
- Java学习第一天
Java学习第一天 对于网络管理员或者黑客必须知道的八个cmd命令 详情请参考:http://www.2cto.com/os/201608/533964.html nbtstat ...
- 一、Android学习第一天——环境搭建(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 一. Android学习第一天——环境搭建 Android 开发环境的搭建 ...
- web学习第一章
web学习第一章 我是大概9月10日开始走上IT之路的,一开始学习了小段时间的自动化办公软件, 昨天我开始学习客户端网页编程,我了解什么是WEB,一些比较老古董的计算模式和发展历史,印象最让我深刻 ...
- Java 学习第一步-JDK安装和Java环境变量配置
Java学习第一步——JDK安装及Java环境变量配置 [原文] 2014-05-30 9:09 Java SE 阿超 9046 views Java作为当下很主流的编程语言,学习Java的朋 ...
- swift系统学习第一章
第一节:变量,常量,类型推断,字符,字符串 //swift学习第一节 /* 变量 常量 类型推断 字符 字符串 */ import UIKit //变量 var str = "swift&q ...
- (译) 强化学习 第一部分:Q-Learning 以及相关探索
(译) 强化学习 第一部分:Q-Learning 以及相关探索 Q-Learning review: Q-Learning 的基础要点是:有一个关于环境状态S的表达式,这些状态中可能的动作 a,然后你 ...
- [未完成]WebService学习第一天学习笔记
[未完成]WebService学习第一天学习笔记[未完成]WebService学习第一天学习笔记
随机推荐
- vue安装iview和配置
在命令行工具上输入:npm install iview --save 等待安装完成. 在项目的src/main.js中添加三行代码引入iview import iView from 'iview' i ...
- java——逻辑运算符与(&和&&)或(|和||)
区别: 1意思不同: &&是“与”的意思,||是“或者”的意思. 2 使用上不同:a && b:a和b同时为true 才返回 true, 否则返回false:a || ...
- jquery获取元素
let $lis = $('#sidebar-menu li[to]')//获取sidebar-menu下包含to属性的li
- Linux内核设计与实现 总结笔记(第十四章)块I/O层
一.剖析一个块设备 块设备最小的可寻址单元是扇区. 扇区大小一般是2的整数倍,最常见的是512字节. 因为各种软件的用途不同,所以他们都会用到自己的最小逻辑可寻址单元----块.块只能基于文件系统,是 ...
- luogu P1428 小鱼比可爱 x
P1428 小鱼比可爱 题目描述 人比人,气死人:鱼比鱼,难死鱼.小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度.参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示 ...
- android发送udp,tcp消息
发送方创建步骤: 1. 创建一个DatagramSocket对象 DatagramSocket socket = new DatagramSocket (4567); 2. 创建一个 InetA ...
- icon组件
iocn组件,小程序给我们提供了一些小图标,与微信的风格一致 iocn组件的属性: type:类型:string icon的类型: 属性值:success:成功 带背景的 success_no_c ...
- 克隆虚拟机启动网卡提示错误 Device eth0 does not seem to be present, delaying initialization
错误原因: 克隆的Linux系统在新的机器上运行,新服务器网卡物理地址已经改变.而/etc/udev/rules.d/70-persistent-net.rules这个文件确定了网卡和MAC地址的信息 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_14-ArrayList集合的常用方法和循环
常用的方法记下来 刚创建好,什么都不放的 add添加方法肯定是成功的. 加了这么多的值都没有用返回值,输出的结果可以看到都是添加成功的 获取索引值 ALT+回车键,推荐使用本地变量去接收 这样左边就会 ...
- Haddop的数据计算部分原理
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import o ...