dart服务器开发性能,DartVM服务器开发(第四天)--代码优化
優化請求上一篇文章中,我們通過依賴第三方http_server這個包實現將html頁面返回給瀏覽器,但是一般的服務器都包含請求html,json格式的傳遞,這樣就有可能造成了混亂,下面我們使用http_server這個包進行優化吧!
在上一篇文章中,有人問了相對路徑在不同的系統的表現是不一樣的,那么,我們今天使用絕對路徑,獲取當前項目的絕對路徑是很容易的,通過下面代碼獲取var?webPath=Platform.script.toFilePath();
這里有一個Platform類,這個類主要提供有關計算機和操作系統的信息,而PlatForm.script主要獲取當前運行腳本的絕對Uri,Uri內容為File://地址,然后toFilePath()就是獲取當前Uri的地址
我們來輸出運行一下看看吧!
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的存放位置了,我們來看一下現在的值吧!
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下面添加幾個頁面
添加幾個頁面.png
接下來我們根據路徑請求一下服務器
頁面一.png
頁面二.png
關于頁面.png
我們試著去請求一個不存在的頁面
可以看到不存在.png
我們為沒有找到的頁面進行定制一下staticFiles.errorPageHandler=(request){????if(request.uri.pathSegments.last.contains('.html')){
staticFiles.serveFile(new?File(webPath+'/404.html'),?request);
}else{
handleMessage(request);
}
};
這里我們判斷請求地址最后請求的文件是否為一個html頁面,如果是,就為它返回一個404的頁面,如果不是,就去處理消息
404頁面png
啟動服務器,我們重新請求之前找不到的地址,看看有什么變化
可以看到,返回了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
總結
以上是生活随笔為你收集整理的dart服务器开发性能,DartVM服务器开发(第四天)--代码优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机二级网址打不开,大神为你解决win
- 下一篇: 咸阳治无精症比较好的医院推荐