搜索
aardio官方社区 门户 查看主题

演示一个简单WEB服务器,网页的文字图形音乐都能展示的目标基本实现。

发布者: 0ximi | 发布时间: 2017-12-6 22:52| 查看数: 1178| 评论数: 11|帖子模式

  1. /*
  2.   演示一个简单WEB服务器,网页的文字图形音乐都能展示的目标基本实现。
  3.   未来目标:1、完善路由函数
  4.             2、实现GET POST数据上传
  5.             3、数据能实现sqlite3存储
  6. */
  7. // 导入调试库、线程库、simpleHttpServer库、网卡库
  8. import console;
  9. import process;
  10. import wsock.tcp.simpleHttpServer;
  11. import inet.adapter;
  12. // 确定本机IP 用于服务器绑定IP
  13. for adptInfo in inet.adapter.each() {
  14.         if ( string.match(adptInfo.description ,"本地连接")){
  15.           webIp = adptInfo.currentIpAddress;
  16.           break ;
  17.         }elseif( string.match(adptInfo.description ,"无线网络连接") ){
  18.           webIp = adptInfo.currentIpAddress;
  19.           break ;
  20.         }
  21. }
  22. //启动 ip为webIp,端口为80的服务器线程。
  23. var srvHttp = wsock.tcp.simpleHttpServer( webIp ,80);

  24. //cmd模式显示 url连接 ,WIN系统调出默认浏览器测试网页情况效果。
  25. console.log(srvHttp.getUrl());
  26. process.execute(srvHttp.getUrl());

  27. //服务器响应后各种处理步骤,放在匿名函数function(response,request)内。
  28. srvHttp.run(
  29.     function(response,request){
  30.       
  31.      //导入输入输出库、字符串操作库、url解析库
  32.      import io;
  33.      import string;
  34.      import inet.url;
  35.      import console;
  36.      /*
  37.        设计路由函数:
  38.        参数:url
  39.        返回:目标路径、目标文件类型、错误标记、错误页面
  40.      
  41.      */
  42.      var UrlRouter =function(url){

  43.          var errorFlag = false;
  44.          //计算目标路径
  45.          var sfile = url;        
  46.          if( sfile == "/" || sfile ="/main.aardio"){
  47.               sfile = "d:\web\index.html";
  48.          }else{
  49.               sfile = "d:\web" + string.replace(sfile,"/","");
  50.          }
  51.          //计算目标文件类型
  52.          var ctType ="";
  53.          if(string.match(sfile,".")){}else{sfile = sfile+".*"};
  54.              ext = string.split( sfile,'.')[2];
  55.          select(ext) {
  56.                  case "html" { ctType ="text/html"; }
  57.                  case "htm"  { ctType ="text/html"; }
  58.                  case "xml"  { ctType ="text/xml";  }
  59.                  case "js"   { ctType ="application/x-javascript";}
  60.                  case "css"  { ctType ="text/css";}
  61.                  case "txt"  { ctType ="text/plain";}
  62.                  case "jpg"  { ctType ="image/jpeg";}
  63.                  case "png"  { ctType ="image/image/png";}
  64.                  case "gif"  { ctType ="image/image/gif";}
  65.                  case "ico"  { ctType ="image/image/x-icon";}
  66.                  case "bmp"  { ctType = "application/x-bmp";}
  67.                  case "*"  { ctType ="application/octet-stream";}
  68.                    else {
  69.                             ctType ="application/octet-stream";
  70.                  }
  71.          }
  72.              //目标文件不存在404处理
  73.          var fullpath = io.exist( sfile );
  74.          if( ! fullpath ){
  75.               var page404 = /*
  76.                             <!DOCTYPE html><html><head><title>404错误 - HTTP made by Aardio</title><body><br><p style='text-align:center;font-family:consolas'>"don't busy on trying, maybe you just took a wrong way of opening."<br>        -- kindly tip from <i style='color:red;font-size:32px'>404</i></p></body></head></html>
  77.                             */
  78.               errorFlag = true;
  79.               errhtml = page404;
  80.          }
  81.          return sfile, ctType, errorFlag, errhtml;   
  82.      };
  83.    
  84.      /*
  85.         服务器响应后各种处理步骤:
  86.      第一步,通过获取到的 请求响应request对象的url属性,分解出url中的path。
  87.      
  88.      第二步,将path传去路由函数,为了获取 目标路径、目标文件类型、错误标记、错误页面 等结果。
  89.      
  90.      第三步,依据路由函数返回的结果。
  91.              回复对象的contentType属性设置为路由函数返回的目标文件类型。
  92.              回复对象的传送数据:错真就传错误页面,错假就传目标文件的二进制数据 。
  93.              回复对象的其他属性按simpleHttpServer内置默认的。
  94.      */
  95.      var url = request.url ;
  96.      var urlArray = inet.url.split( url );
  97.      var urlPath = urlArray.path;
  98.      console.log(urlPath);     
  99.      var sfile, ctType, err, errdate = UrlRouter(urlPath);
  100.      if(err){
  101.                   response.writeBuffer( errdate ,string.len(errdate));
  102.      }else {
  103.             var file = io.open(sfile,"rb");
  104.             while(
  105.                  var buf;
  106.                  buf,readSize = file.read(1024);
  107.                  buf
  108.                  ){
  109.                  response.contentType = ctType;
  110.                  response.writeBuffer(buf,readSize) ;
  111.             }
  112.             file.close();      
  113.      }
  114.      response.close();

  115. })
复制代码

最新评论

0ximi 发表于 2017-12-6 23:02:48
网站目录为:d:\web
zhoubujin 发表于 2017-12-6 23:17:55
Jacen.He 发表于 2017-12-7 00:49:34
代码是写的很不错,

不过这些功能,不是 wsock.tcp.simpleHttpServer 内部都已提供了吗?!
象URL解析,MIME获取这些都已经在request对象里有了呀。

如果要做路由,只要判断 request.contentType ,根据 request.path 作出应答就可以。
普通的文件下载,或者 aardio模板解析输出,用 response.loadcode( request.path );  就可以了。

获取文件的MIME类型,可以用这个函数
fsys.mime.fromFile(".html")
0ximi 发表于 2017-12-7 12:46:53
第52句复制过程丢失了"\",应纠正为 sfile = "d:\web" + string.replace(sfile,"/","\");

因为inet,wsock,simpleHttpServer库读得不深入,这个演示是东边看点,西边看点,
尽量多了解WEB服务器原理后,看着《VB6之HTTP服务器的实现 - lichmama - 博客园》
https://www.cnblogs.com/lichmama/archive/2014/07/06/3828543.html
试着将它翻译为aardio代码,当中除了碰到mswinsock.getData()函数问题;
还卡住在二进制数据传不全,乱码。感觉一些原理多多少少知道一点点,翻译代码也基本弄出来,能出404页面,乱码页。
最后才考虑到全部用aardio代码库去实现,参考simpleHttpServer的文件服务器代码、
aardio\codes\范例程序\网络应用\wsock\传送文件\服务端.aardio  以及VB6之HTTP服务器的实现悟出的东西,凑出来的代码。

Jacen.He 发表于 2017-12-7 13:13:36
0ximi 发表于 2017-12-7 12:46
第52句复制过程丢失了"\",应纠正为 sfile = "d:\web" + string.replace(sfile,"/","\");

因为inet,wsoc ...
仅仅是实现一个HTTP服务器没有几句代码的,
HTTP协议可以想简单一点就是发个字符串的事,不要去想的很复杂。

wsock.tcp.simpleHttpServer 是要构建一个兼容FastCGI的开发环境,例如提供兼容的request,response对象,虽然他的名字叫simpleHttpServer ,还是实现了不少东西,例如多线程,304检测这些(避免重复请求下载未更改的文件),断点续传,POST,文件上传..........,虽然叫simpleHttpServer ,但是可以直接在里面开发网站,如果用VB6来打比方 - 相当于用VB6实现一个支持ASP开发的HTTP服务器。
hejin8288 发表于 2017-12-10 14:45:17
有用,顶一下!
hejin8288 发表于 2017-12-10 17:23:02
Jacen.He 发表于 2017-12-7 13:13
仅仅是实现一个HTTP服务器没有几句代码的,
HTTP协议可以想简单一点就是发个字符串的事,不要去想的很复杂 ...

Jacen,是不所有的干活都要放到 server.run(
                function(response,request){
                        //response.loadcode( request.path ); //参数可以省略
                        response.write("AAAAAAAAAAAAAAAA");
                       
                       
                       
                }        
        );
里面操作?
Jacen.He 发表于 2017-12-10 17:27:37
hejin8288 发表于 2017-12-10 17:23
Jacen,是不所有的干活都要放到 server.run(
                function(response,request){
                        //response.loadcode( r ...

run函数只是启动器,
你用你注释掉的 response.loadcode( request.path ); 就可以加载网址里请求路径对应的代码了。
hejin8288 发表于 2017-12-10 17:33:32
Jacen.He 发表于 2017-12-10 17:27
run函数只是启动器,
你用你注释掉的 response.loadcode( request.path ); 就可以加载网址里请求路径对 ...

Jacen回复的好快!
我是说,比如我写了一个读取数据库表记录的function dbTest(){}函数,那我的这个dbTest要放到哪里调用,是不是只写在server.run(
                 function(response,request){
})里?
Jacen.He 发表于 2017-12-10 19:00:04
hejin8288 发表于 2017-12-10 17:33
Jacen回复的好快!
我是说,比如我写了一个读取数据库表记录的function dbTest(){}函数,那我的这个dbTest ...
你要在run函数里调用dbTest,
并不需要把dbTest写在run里面。

前面我已经回复过你这个问题了,run只是一个线程启动函数。
你可以把server.run 理解成IIS, 你自己的代码就是PHP,要要执行PHP,你写PHP文件里就可以了,并不需要去纠结怎么把他写到IIS的代码里。

先去看一下入门教程,
得到别人的回复,去思考一下,动一下手,不要不停的追问。
hejin8288 发表于 2017-12-10 22:30:28
Jacen.He 发表于 2017-12-10 19:00
你要在run函数里调用dbTest,
并不需要把dbTest写在run里面。

好的,谢谢!

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-7-16 23:55 , Processed in 0.062500 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表