dart服务器开发性能,DartVM服务器开发(第四天)--代码优化

优化请求上一篇文章中,我们通过依赖第三方http_server这个包实现将html页面返回给浏览器,但是一般的服务器都包含请求html,json格式的传递,这样就有可能造成了混乱,下面我们使用http_server这个包进行优化吧!

在上一篇文章中,有人问了相对路径在不同的系统的表现是不一样的,那么,我们今天使用绝对路径,获取当前项目的绝对路径是很容易的,通过下面代码获取var webPath=Platform.script.toFilePath();

这里有一个Platform类,这个类主要提供有关计算机和操作系统的信息,而PlatForm.script主要获取当前运行脚本的绝对Uri,Uri内容为File://地址,然后toFilePath()就是获取当前Uri的地址

我们来输出运行一下看看吧!

AAffA0nNPuCLAAAAAElFTkSuQmCC

pathToBuild的值.png

然后,我的html路径为

/Users/rhyme/WebstormProjects/ServerApp/webApp

那么我们怎么改为该路径呢,下面是我的代码import 'package:path/path.dart';  var webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';

可以看到,我导入了path.dart这个文件,这个文件中有一个方法dirname().该方法可以知道,获取目录的名字,我获取了两次目录的名字,就是当前项目的根目录,然后就是拼接上"/webApp"这个字符串,就是html的存放位置了,我们来看一下现在的值吧!

AAffA0nNPuCLAAAAAElFTkSuQmCC

image.png

可以看到成功的获取到了,这个就是我的html存放路径,如果你是win系统,也可以通过该方法去试着获取到html存放路径,下面就将该路径传入到http_server这个包的一个类中,在此之前,我们昨天有人可能对下面这一段代码有点疑问

main() async {

VirtualDirectory staticFiles=new VirtualDirectory('.');//.....

}

}

对的,这里的VirtualDirectory构造方法中,我们传入了一个“ . ”这个点就是要传入我们的html目录路径了,我们一定要记得,这里需要传入绝对路径,下面就是拼接的代码var webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';

VirtualDirectory staticFiles=new VirtualDirectory(webPath);

接下来,我们要让VirtualDirectory这个类去接管收到的请求,并根据路径访问html页面var webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';

VirtualDirectory staticFiles=new VirtualDirectory(webPath);  //允许目录监听,按照目录去请求

staticFiles.allowDirectoryListing=true;//目录处理,当请求根目录时,会返回该地址

staticFiles.directoryHandler=(dir,request){    var indexUri=new Uri.file(dir.path,).resolve('index.html');

staticFiles.serveFile(new File(indexUri.toFilePath()), request);

};  var requestServer = await HttpServer.bind(InternetAddress.loopbackIPv6, 8080);  print('监听 localhost地址,端口号为${requestServer.port}');  //监听请求

await for (HttpRequest request in requestServer) {//交给staticFiles处理了

staticFiles.serveRequest(request);//    logUtils.writeHeaders(request);    if(request.uri.toString()=='/'||request.uri.toString().endsWith('.html')){    }else{//      handleMessage(request);//    }//

}

最后,我们在webApp下面添加几个页面

AAffA0nNPuCLAAAAAElFTkSuQmCC

添加几个页面.png

接下来我们根据路径请求一下服务器

AAffA0nNPuCLAAAAAElFTkSuQmCC

页面一.png

AAffA0nNPuCLAAAAAElFTkSuQmCC

页面二.png

AAffA0nNPuCLAAAAAElFTkSuQmCC

关于页面.png

我们试着去请求一个不存在的页面

AAffA0nNPuCLAAAAAElFTkSuQmCC

可以看到不存在.png

我们为没有找到的页面进行定制一下staticFiles.errorPageHandler=(request){    if(request.uri.pathSegments.last.contains('.html')){

staticFiles.serveFile(new File(webPath+'/404.html'), request);

}else{

handleMessage(request);

}

};

这里我们判断请求地址最后请求的文件是否为一个html页面,如果是,就为它返回一个404的页面,如果不是,就去处理消息

AAffA0nNPuCLAAAAAElFTkSuQmCC

404页面png

启动服务器,我们重新请求之前找不到的地址,看看有什么变化

AAffA0nNPuCLAAAAAElFTkSuQmCC

可以看到,返回了404的页面.png

接下来,我们优化一下代码main() async {  //获取文件根目录

var webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';

VirtualDirectory staticFiles=new VirtualDirectory(webPath);  //允许目录监听

staticFiles.allowDirectoryListing=true;  //处理访问根目录

staticFiles.directoryHandler=(dir,request){    var indexUri=new Uri.file(dir.path,).resolve('index.html');

staticFiles.serveFile(new File(indexUri.toFilePath()), request);

};  //处理访问不存在的页面

staticFiles.errorPageHandler=(request){    if(request.uri.pathSegments.last.contains('.html')){

staticFiles.serveFile(new File(webPath+'/404.html'), request);

}else{

handleMessage(request);

}

};  var requestServer = await HttpServer.bind(InternetAddress.loopbackIPv6, 8080);  print('监听 localhost地址,端口号为${requestServer.port}');  //监听请求

await requestServer.forEach(staticFiles.serveRequest);

}

作者:rhyme_lph

链接:https://www.jianshu.com/p/2ca96f92efb6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android】SVG和VectorDrawable——相关格式转换

SVG是矢量图,刚接触尚不能仔细介绍,但只需记得一点:放大不失真,存储也方便。 因为多数户型图使用SVG格式,Android要用的话必须通过相关转换工具,将原SVG格式文件,转换为XML后缀的VectorDrawable…

css中基线指的是哪一条线,如何设置基线网络_CSS, Vertical Rhythm 教程_W3cplus

首先,当谈到排版,我们先要了解基线是什么?维基百科是这样定义)的:在排版和书法中,基线是以字终sit底线为基础,并且向两边延伸的直线。好极了,但我为什么要忽视他呢?好希望你充满激情…

使用JGroups进行ElasticMQ消息复制

ElasticMQ是一台消息服务器,具有Scala,Java和与Amazon SQS兼容的接口。 它通过跨服务器群集复制消息来支持有保证的消息传递,并通过日志记录实现消息持久性。 消息复制是ElasticMQ的核心功能之一。 但是,如果您看一下代码&#xf…

Spring Social入门

像我一样,无论是添加简单的Facebook“赞”按钮,一大堆“共享”按钮还是显示时间轴信息,您都不会注意到当前对应用程序“社交化”的热衷。 每个人都在做这件事,包括Spring的家伙,事实上,他们提供了一个称为S…

apache ajax 跨域访问,Apache 实现AJAX跨域请求

当使用ajax跨域请求时,浏览器报错:XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin.肯定是跨域的问题,如果用jsonp或者pro更多:当使用ajax跨域请求时,浏览器报错:XmlHtt…

EhCache复制:RMI与JGroups

最近,我正在研究一种需要复制缓存的产品。 缓存提供程序已经确定-EhCache,剩下的就是有关传输的问题。 哪一个是最佳选择? 这里的最佳选择是指性能更好的选择。 仅在两个可用传输之间进行了性能评估-JGroups和RMI,对其他传输不予考…

服务器wifi无线放大器,一回家WiFi信号太弱?教你用两毛钱制作信号放大器

原标题:一回家WiFi信号太弱?教你用两毛钱制作信号放大器现在家家户户都有无线路由器,但是大部分人都还是早期的单天线产品,信号覆盖范围比较小,特别是穿墙性能不行。人在客厅WiFi信号还满格,一到卧室就瞬间…

iOS开发 之 可穿戴设备 蓝牙4.0 BLE 开发

1 前言 当前有越来越多的可穿戴设备使用了蓝牙4.0 BLE(Bluetooth Low Energy)。对于iOS开发而言,Apple之前专门推出CoreBluetooth的Framework来支持BLE的开发。对于硬件开发有了解的朋友应该知道,在之前使用低版本的蓝牙的设备,要…

git服务器维护 备份,gitlab服务运维,备份与恢复 - 橙子柠檬's Blog

gitlab服务运维工作Gitlab-ctl 使用gitlab-ctl start #启动服务gitlab-ctl stop #停止服务gitlab-ctl restart #重启服务检查服务的日志信息gitlab-ctl tail redis #检查redis的日志gitlab-ctl tail postgresql #…

使用TestNG的弹簧测试支持

TestNG是一个测试框架,旨在涵盖所有类别的测试:单元,功能,端到端,集成等。 它包括许多功能,例如灵活的测试配置,对数据驱动测试的支持(使用DataProvider),强大…

Entity Framework - 理清关系 - 基于外键关联的单向一对一关系

注:本文针对的是 Entity Framework Code First 场景。 之前写过三篇文章试图理清Entity Framework中的一对一关系(单相思(单向一对一), 两情相悦(双向一对一), 两情相悦-续),但当时理…

微信社交小程序服务器,Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端...

要搞一个小型的cms内容发布系统因为小程序上线之后,直接对数据库进行操作的话,慧出问题的,所以一般都会做一个管理系统,让工作人员通过这个管理系统来对这个数据库进行增删改查微信小程序其实给我们提供了这样的能力了(也就是可以…

文件共享服务器imac,iMac怎么在网络上共享设备windows文件夹和服务 | MOS86

本章通过向您展示如何在网络和Mac和Windows计算机之间共享文件,文件夹和设备,帮助您充分利用您的iMac网络连接。→使用Macs共享文件和文件夹使用AirDrop和文件共享→与Windows 7计算机共享文件→设置共享权限→使用共享表快速在线共享文件→共享和访问网…

【转】 简单理解Socket

题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人;但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有意思,动手写…

业务活动监视器(BAM)2.0带来的革命

生产兼具精益和企业价值的中间件是一项艰巨的工作。 它要么不存在,要么需要创新的思维(很多),并且需要在实现中反复进行。 业务风险很大,但是如果您做对了,它就会使您领先于其他任何公司。 这就是为什么我们…

oracle销售服务器吗,oracle 服务器 版本

oracle 服务器 版本 内容精选换一换Atlas 800 训练服务器(型号 9010)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 训练服务器 用户指南 (型号9010)》。Atlas 800 训练服务器(型号 9010)适配操作系统如表1所示。请参考表2下载驱动和固件包。Atlas 800 训…

html 甘特图_Rplotly|交互式甘特图(Gantt chart)项目管理/学习计划

甘特图(Gantt chart),又常被称为横道图或者条状图,是现代企业项目管理领域运用最为广泛的一种图示。就是通过条形来显示项目的进度、时间安排等相关情况的。项目管理外,也可以用来管理学习计划。绘制甘特图的工具有很多,本文介绍使…

Oracle Coherence:分布式数据管理

本文介绍如何使用Oracle Coherence提供分布式(分区)数据管理。 在下面的示例应用程序中,创建了一个名为OTV的新集群,并且在该集群的两个成员之间分配了一个名为user-map的缓存对象。 二手技术: JDK 1.6.0_21 Maven的…

美团点评DBProxy读写分离使用说明

目的 因为业务架构上需要实现读写分离,刚好前段时间美团点评开源了在360Atlas基础上开发的读写分离中间件DBProxy,关于其介绍在官方文档已经有很详细的说明了,其特性主要有:读写分离、负载均衡、支持分表、IP过滤、sql语句黑名单、…

apriori算法c++_关联分析——基于Apriori算法实现

电子商务推荐系统主要是通过统计和挖掘技术,根据用户在网站上的行为,主动为用户提供推荐服务,从而提高网站体验。而根据不同的业务场景,推荐系统需要满足不同的推荐粒度,包括搜索推荐,商品类目推荐,商品标签推荐,店铺推…