精华内容
下载资源
问答
  • Hello, Web 现在,我们已经为编写我们第一个简单的 Web 服务器做好了准备。基本思想很简单: 等待用户连接我们的站点并发送一个 HTTP 请求; 解析请求; 计算出它所请求的; 获取数据(或动态生成); 格式化数据为 ...

    花下猫语: 上篇文章推荐了一本神书《500 Lines or Less》(点此阅读),有几位读者留言问是否有中文版。很遗憾,还没有。不过我在文中也说了,Github 上有个翻译计划,已收录了 10 几篇中文译文。这些文章的代码量虽然不多,但是因为讲解的内容很详细,所以篇幅都很长。今天就先给大家分享其中一篇较短的吧。如果感兴趣的话,上篇文章末尾附了链接,可去查看。

    281277b38eb4e00d0dc0ad5c4a574fd6.png

    作者简介:Greg Wilson 是 Software Carpentry(一个科学家和工程师的计算技巧速成班)的创始人。他在工业界和学术界工作了三十余年,是好几本计算相关图书的作者或编辑,包括了 2008 年 Jolt 图书奖得主 Beautiful Code开源软件架构 的前两卷。1993 年,Greg 获得了爱丁堡大学的计算机博士学位。

    简介

    在过去的二十多年里,网络改变了社会的各个方面,但它的核心却改动不多。大多数系统仍然遵循着 Tim Berners-Lee 在 25 年前所制定的规则。尤其是,大多数 Web 服务器仍旧以相同的方式处理着相同的数据,一如既往。

    本章节将探讨它们如何实现。与此同时,本章节还将探讨开发者如何创建增加新特性而不需要重写的软件系统。

    背景

    几乎所有的网络程序都运行在一类叫做 互联网协议(IP)的通信标准上。这类协议中,我们涉及的是传输控制协议(TCP/IP),该协议使得计算机间通信类似于读写文件。

    程序通过套接字使用 IP 协议进行通信。每个套接字是点对点通信信道的一端,正如电话机是一次电话通信的一端。一个套接字包含着一个 IP 地址,该地址确定了一台确定的机器和该机器上的一个端口号。IP 地址包含了四个八位数字,比如 174.136.14.108;域名系统将这些数字与字符相匹配,比如 aosabook.org,以便于记忆。

    端口号码是 0 - 65535 之间的一个随机数,唯一确定了主机上的套接字。(如果说 IP 地址像一家公司的电话号码,那么端口号就像是分机号。)端口 0 - 1023 预留给操作系统使用;任何人都可以使用剩下的端口。

    超文本传输协议(HTTP)描述了程序通过 IP 协议交换数据的一种方法。HTTP 协议刻意设计得简单: 客户端通过套接字发送一个请求,指定请求的东西,服务器在响应中返回一些数据(如下图)。该数据或许复制自硬盘上的文件,或许由程序动态生成,或是二者的混合。

    59f6c9855286cb2c0b84b506ac3eff89.png

    关于 HTTP 请求,最重要的地方在于,它仅由文本组成。任何有意愿的程序都可以对其进行创建或解析。不过,为了被正确地解析,文本中必须包含下图所展示的部分。

    570bbf75e2522506d0620635ba90f8bb.png

    (注: 'sp':空格, 'cr lf':换行) HTTP 方法大多是 GET(请求信息)或者 POST(提交表单或上传文件)。统一资源定位器(URL)确定了客户端所请求的文件路径,一般位于硬盘上,比如 /research/experiments.html, 但是(接下来才是关键),如何处理完全取决于服务器。HTTP 版本一般是 "HTTP/1.0" 或 "HTTP/1.1" ; 二者之间的差异对我们来说并不重要。

    HTTP 首部(Headers)是一组键值对,如同下面这三行:

    Accept: text/htmlAccept-Language: en, frIf-Modified-Since: 16-May-2005

    不同于哈希表中的键,HTTP 首部中,键可以出现任意多次。这将允许请求做一些事,例如指定愿意接收多种类型的内容。

    最后,请求的主体是与请求关联的任何数据。这个应用于通过表单提交数据,上传文件等。首部的末尾和主体的开头之间必须由一个空行,以声明首部的结束。

    首部中, Content-Lenght 告诉服务器在请求主体中有多少字节需要被读取。

    HTTP 响应的格式与 HTTP 请求类似:

    1c508ef81f39098acbbba7a5b6bcabbe.png

    版本号,首部,主体有着相同的格式和意义。状态码是一个数字,用来指示在处理请求时所发生的事情: 200 意味着 "一切工作正常",404 意味着 "没有找到",其他状态码也分别有着各自的含义。 状态词以易读的形式重复着上述信息,比如 "一切正常" 或是 "没有找到"。

    本节中,我们只需要了解关于 HTTP 的两件事情。

    第一,HTTP 是无状态的: 每个请求自行处理,服务器在两个请求之间不会记住任何东西。如果应用想要跟踪一些信息,比如用户的身份,它必须自己实现。

    实现的方法通常使用 cookie, 这是服务器发送到客户端的短字符串,之后由客户端返回给服务器。当用户执行一些函数,需要在多个请求之间保存状态时,服务器会创建一个新的 cookie,将它存储在数据库中,然后发送给浏览器。每次浏览器返回 cookie,服务器通过 cookie 寻找关于用户行为的信息。

    我们需要了解的第二点是,可以填充参数以提供更多的信息。比如说,如果我们使用搜索引擎,我们需要指定关键词。我们可以将这些附加到 URL 路径中,但更应该是在 URL 中附加参数。我们在 URL 后附加 '?' ,之后是以 '&' 分隔的键值对('key=value')。比如说,URL http://www.google.ca?q=Python 要求谷歌查询关于 Python 的页面: 键是字母 'q',值是 'Python'。长一点的查询 http://www.google.ca/search?q=Python&client=Firefox,告诉谷歌我们在使用 Firefox,诸如此类。我们可以传输任何参数,不过,哪些参数需要注意,如何解释这些参数,完全取决于网站上运行的程序。

    当然,如果 '?' 和 '&' 用作特殊字符,必然有方法加以避免,正如必须有方法将一个双引号字符放置在由双引号分隔的字符串内。URL 编码标准使用 '%' 后跟两位代码表示特殊字符,并使用 '+' 字符替代空格。因此,我们使用 URL http://www.google.ca/search?q=grade+%3D+A%2B 在谷歌中搜索 "grade = A+"(注意空格)。

    打开套接字,构建 HTTP 请求,解析响应极其乏味,因此大多数用户使用库来做大部分工作。Python 附带了一个这样的库,叫做 urllib2(因为它是之前的库 urllib 的代替者),但是它暴露了许多大多数用户不关心的东西。相比于 urllib2,Requests 库是一个更加易于使用的选择。接下来是一个例子,使用 Requests 下载来自 AOSA book 站点的一个页面。

    import requestsresponse = requests.get('http://aosabook.org/en/500L/web-server/testpage.html')print 'status code:', response.status_codeprint 'content length:', response.headers['content-length']print response.textstatus code: 200content length: 61  

    Test page.

    requests.get 向服务器发送一个 HTTP GET 请求,返回一个包含响应的对象。该对象的 status_code 是响应的状态码;它的 content_length 是响应数据的字节数; text 是真正的数据(在这个例子中,是一个 HTML 页面)。

    Hello, Web

    现在,我们已经为编写我们第一个简单的 Web 服务器做好了准备。基本思想很简单:

    1. 等待用户连接我们的站点并发送一个 HTTP 请求;
    2. 解析请求;
    3. 计算出它所请求的;
    4. 获取数据(或动态生成);
    5. 格式化数据为 HTML;
    6. 返回数据。

    步骤 1, 2, 6 都是从一个应用程序到另一个,Python 标准库有一个 'BaseHTTPServer' 模块,为我们实现这部分。我们只需要关心步骤 3 - 5,这也是我们在下面的小程序中所做的。

    import BaseHTTPServerclass RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): '''Handle HTTP requests by returning a fixed 'page'.''' # Page to send back. Page = '''

    Hello, web!

    ''' # Handle a GET request. def do_GET(self): self.send_response(200) self.send_header("Content-Type
    展开全文
  • Web服务器Web服务器也称为超文本传输协议服务器,使用http与其客户端进行通信,基于java的web服务器会使用两个重要的类,.首先java.net.Socket类和java.net.ServerSocket类,并基于发送http消息进行通信。步骤1;...

    Web服务器

    Web服务器也称为超文本传输协议服务器,使用http与其客户端进行通信,基于java的web服务器会使用两个重要的类,

    • .首先java.net.Socket类和java.net.ServerSocket类,并基于发送http消息进行通信。

    步骤1;

    应用程序的入口在HttpServer 类中,main()方法创建一个HttpServer实例,然后调用其await()方法,顾名思义,await()方法会在指定端口上等待HTTP请求,对其进行处理,然后发送响应信息回客户端,在接收到关闭命令前,它会保持等待状态。

    Request类表示一个HTTP请求,可以传递InputStream对象来创建Request对象,可以调用InputStream对象中的read()方法来读取HTTP请求的原始数据。

    4886527e1e59e4f4ce01857f1351cbac.png

    上述源码中的parse()方法用于解析Http请求的原始数据,parse()方法会调用私有方法parseUrI()来解析HTTP请求的URI,除此之外,并没有做太多的工作,parseUri()方法将URI存储在变量uri中,调用公共方法getUri()会返回请求的uri。

    4b7fd6c663c1e8809c67949bf871210b.png

    b5bfcf1afda0706767c489ec7ed32030.png

    Response对象在HttpServer类的await()方法中通过传入套接字中获取的OutputStream来创建。

    Response类有两个公共方法:setRequest()和sendStaticResource() ,setRequest()方法会接收一个Request对象为参数,sendStaticResource()方法用于发送一个静态资源到浏览器,如Html文件。

    这个类表示一个Web服务器,这个Web服务器可以处理对指定目录的静态资源的请求,该目录包括由公有静态变量final WEB_ROOT指明的目录及其所有子目录。

    现在在webroot中创建一个html页面,命名为index.html,源码如下

    e6c6409221bd3dd61b8cd839231b3b1f.png

    69b276be8dfda55c858d9ef9016fcd5b.png
    展开全文
  • 说明利用HTTP模块 URl模块 Path模块 Fs模块创建 在项目文件夹下,创建文件夹static,下面创建index.html//引入http模块varhttp=require('http');//fs模块varfs=require('fs');http.createServer(function(req,res){//...

    34cb795df45a62f4995ff45ba30aa39e.gif

    说明

    利用HTTP模块 URl模块 Path模块 Fs模块创建 在项目文件夹下,创建文件夹static,下面创建index.html

    //引入http模块
    var http=require('http');
    //fs模块
    var fs=require('fs');
    http.createServer(function(req,res){
        //http://localhost:8001/news.html /news.html
        //http://localhost:8001/index.html /index.html
        //css/dmb.bottom.css
        var pathname=req.url;
        if(pathname=='/'){
            pathname='/index.html'; /*默认加载的首页*/
        }
        if(pathname!='/favicon.ico'){ /*过滤请求favicon.ico*/
            console.log(pathname);
            //文件操作获取 static下面的index.html
            fs.readFile('static/'+pathname,function(err,data){
                if(err){ /*么有这个文件*/
                    console.log('404');
                }else{ /*返回这个文件*/
                    res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});
                    res.write(data);
                    res.end(); /*结束响应*/
                }
            })
        }
    }).listen(8001);

    改进,加入path模块,动态获取文件类型

    //引入http模块
    var http=require('http');
    //fs模块
    var fs=require('fs');
    //path模块
    var path=require('path'); /*nodejs自带的模块*/
    var mimeModel=require('./model/getmime.js');
    //console.log(mime.getMime('.css')); //获取文件类型
    http.createServer(function(req,res){
        //http://localhost:8001/news.html /news.html
        //http://localhost:8001/index.html /index.html
        //css/dmb.bottom.css
        var pathname=req.url;
        if(pathname=='/'){
            pathname='/index.html'; /*默认加载的首页*/
        }

        //获取文件的后缀名
        var extname=path.extname(pathname);
        if(pathname!='/favicon.ico'){ /*过滤请求favicon.ico*/
            //console.log(pathname);
            //文件操作获取 static下面的index.html
            fs.readFile('static/'+pathname,function(err,data){
                if(err){ /*么有这个文件*/
                    console.log('404');
                    fs.readFile('static/404.html',function(error,data404){
                        if(error){
                            console.log(error);
                        }
                        res.writeHead(404,{"Content-Type":"text/html;charset='utf-8'"});
                        res.write(data404);
                        res.end(); /*结束响应*/
                    })

                }else{ /*返回这个文件*/

                    var mime=mimeModel.getMime(extname); /*获取文件类型*/
                    res.writeHead(200,{"Content-Type":""+mime+";charset='utf-8'"});
                    res.write(data);
                    res.end(); /*结束响应*/
                }
            })
        }
    }).listen(8001);

    加入url模块

    //引入http模块
    var http=require('http');

    //fs模块

    var fs=require('fs');

    //path模块
    var path=require('path'); /*nodejs自带的模块*/

    //url模块

    var url=require('url');


    var mimeModel=require('./model/getmime.js');

    //console.log(mime.getMime('.css')); //获取文件类型

    http.createServer(function(req,res){



        //http://localhost:8001/news.html /news.html
        //http://localhost:8001/index.html /index.html

        //css/dmb.bottom.css

        //xxx.json?214214124

        var pathname=url.parse(req.url).pathname;

        console.log(pathname);

        if(pathname=='/'){
            pathname='/index.html'; /*默认加载的首页*/
        }

        //获取文件的后缀名
        var extname=path.extname(pathname);

        if(pathname!='/favicon.ico'){ /*过滤请求favicon.ico*/
            //console.log(pathname);
            //文件操作获取 static下面的index.html

            fs.readFile('static/'+pathname,function(err,data){

                if(err){ /*么有这个文件*/

                    console.log('404');

                    fs.readFile('static/404.html',function(error,data404){
                        if(error){
                            console.log(error);
                        }
                        res.writeHead(404,{"Content-Type":"text/html;charset='utf-8'"});
                        res.write(data404);
                        res.end(); /*结束响应*/
                    })

                }else{ /*返回这个文件*/

                    var mime=mimeModel.getMime(extname); /*获取文件类型*/
                    res.writeHead(200,{"Content-Type":""+mime+";charset='utf-8'"});
                    res.write(data);
                    res.end(); /*结束响应*/
                }
            })
        }

    }).listen(8001);

    getmine.js

    exports.getMime=function(extname){ /*获取后缀名的方法*/

        switch (extname){

            case '.html':

                return 'text/html';
            case '.css':

                return 'text/css';

            case '.js':

                return 'text/javascript';

            default:
                return 'text/html';
        }

    }

    继续优化,使其文件类型的获取更加全面

    //引入http模块
    var http=require('http');

    //fs模块

    var fs=require('fs');

    //path模块
    var path=require('path'); /*nodejs自带的模块*/

    //url模块

    var url=require('url');

    //引入扩展名的方法是在文件里面获取到的。

    var mimeModel=require('./model/getmimefromfile.js');

    //console.log(mimeModel.getMime('.css')); //获取文件类型

    http.createServer(function(req,res){



        //http://localhost:8001/news.html /news.html
        //http://localhost:8001/index.html /index.html

        //css/dmb.bottom.css

        //xxx.json?214214124

        var pathname=url.parse(req.url).pathname;

        console.log(pathname);

        if(pathname=='/'){
            pathname='/index.html'; /*默认加载的首页*/
        }

        //获取文件的后缀名
        var extname=path.extname(pathname);

        if(pathname!='/favicon.ico'){ /*过滤请求favicon.ico*/
            //console.log(pathname);
            //文件操作获取 static下面的index.html

            fs.readFile('static/'+pathname,function(err,data){

                if(err){ /*么有这个文件*/

                    console.log('404');

                    fs.readFile('static/404.html',function(error,data404){
                        if(error){
                            console.log(error);
                        }
                        res.writeHead(404,{"Content-Type":"text/html;charset='utf-8'"});
                        res.write(data404);
                        res.end(); /*结束响应*/
                    })

                }else{ /*返回这个文件*/

                    var mime=mimeModel.getMime(fs,extname); /*获取文件类型*/
                    res.writeHead(200,{"Content-Type":""+mime+";charset='utf-8'"});
                    res.write(data);
                    res.end(); /*结束响应*/
                }
            })

        }

    }).listen(8001);

    getmimefromfile.js

    exports.getMime=function(fs,extname){ /*获取后缀名的方法*/


        //把读取数据改成同步
        var data=fs.readFileSync('./mime.json');
        //data.toString() 转换成json字符串
        var Mimes=JSON.parse(data.toString()); /*把json字符串转换成json对象*/
        return Mimes[extname] || 'text/html';

    }

    mine.json

    { ".323":"text/h323" ,
      ".3gp":"video/3gpp" ,
      ".aab":"application/x-authoware-bin" ,
      ".aam":"application/x-authoware-map" ,
      ".aas":"application/x-authoware-seg" ,
      ".acx":"application/internet-property-stream" ,
      ".ai":"application/postscript" ,
      ".aif":"audio/x-aiff" ,
      ".aifc":"audio/x-aiff" ,
      ".aiff":"audio/x-aiff" ,
      ".als":"audio/X-Alpha5" ,
      ".amc":"application/x-mpeg" ,
      ".ani":"application/octet-stream" ,
      ".apk":"application/vnd.android.package-archive" ,
      ".asc":"text/plain" ,
      ".asd":"application/astound" ,
      ".asf":"video/x-ms-asf" ,
      ".asn":"application/astound" ,
      ".asp":"application/x-asap" ,
      ".asr":"video/x-ms-asf" ,
      ".asx":"video/x-ms-asf" ,
      ".au":"audio/basic" ,
      ".avb":"application/octet-stream" ,
      ".avi":"video/x-msvideo" ,
      ".awb":"audio/amr-wb" ,
      ".axs":"application/olescript" ,
      ".bas":"text/plain" ,
      ".bcpio":"application/x-bcpio" ,
      ".bin ":"application/octet-stream" ,
      ".bld":"application/bld" ,
      ".bld2":"application/bld2" ,
      ".bmp":"image/bmp" ,
      ".bpk":"application/octet-stream" ,
      ".bz2":"application/x-bzip2" ,
      ".c":"text/plain" ,
      ".cal":"image/x-cals" ,
      ".cat":"application/vnd.ms-pkiseccat" ,
      ".ccn":"application/x-cnc" ,
      ".cco":"application/x-cocoa" ,
      ".cdf":"application/x-cdf" ,
      ".cer":"application/x-x509-ca-cert" ,
      ".cgi":"magnus-internal/cgi" ,
      ".chat":"application/x-chat" ,
      ".class":"application/octet-stream" ,
      ".clp":"application/x-msclip" ,
      ".cmx":"image/x-cmx" ,
      ".co":"application/x-cult3d-object" ,
      ".cod":"image/cis-cod" ,
      ".conf":"text/plain" ,
      ".cpio":"application/x-cpio" ,
      ".cpp":"text/plain" ,
      ".cpt":"application/mac-compactpro" ,
      ".crd":"application/x-mscardfile" ,
      ".crl":"application/pkix-crl" ,
      ".crt":"application/x-x509-ca-cert" ,
      ".csh":"application/x-csh" ,
      ".csm":"chemical/x-csml" ,
      ".csml":"chemical/x-csml" ,
      ".css":"text/css" ,
      ".cur":"application/octet-stream" ,
      ".dcm":"x-lml/x-evm" ,
      ".dcr":"application/x-director" ,
      ".dcx":"image/x-dcx" ,
      ".der":"application/x-x509-ca-cert" ,
      ".dhtml":"text/html" ,
      ".dir":"application/x-director" ,
      ".dll":"application/x-msdownload" ,
      ".dmg":"application/octet-stream" ,
      ".dms":"application/octet-stream" ,
      ".doc":"application/msword" ,
      ".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document" ,
      ".dot":"application/msword" ,
      ".dvi":"application/x-dvi" ,
      ".dwf":"drawing/x-dwf" ,
      ".dwg":"application/x-autocad" ,
      ".dxf":"application/x-autocad" ,
      ".dxr":"application/x-director" ,
      ".ebk":"application/x-expandedbook" ,
      ".emb":"chemical/x-embl-dl-nucleotide" ,
      ".embl":"chemical/x-embl-dl-nucleotide" ,
      ".eps":"application/postscript" ,
      ".epub":"application/epub+zip" ,
      ".eri":"image/x-eri" ,
      ".es":"audio/echospeech" ,
      ".esl":"audio/echospeech" ,
      ".etc":"application/x-earthtime" ,
      ".etx":"text/x-setext" ,
      ".evm":"x-lml/x-evm" ,
      ".evy":"application/envoy" ,
      ".exe":"application/octet-stream" ,
      ".fh4":"image/x-freehand" ,
      ".fh5":"image/x-freehand" ,
      ".fhc":"image/x-freehand" ,
      ".fif":"application/fractals" ,
      ".flr":"x-world/x-vrml" ,
      ".flv":"flv-application/octet-stream" ,
      ".fm":"application/x-maker" ,
      ".fpx":"image/x-fpx" ,
      ".fvi":"video/isivideo" ,
      ".gau":"chemical/x-gaussian-input" ,
      ".gca":"application/x-gca-compressed" ,
      ".gdb":"x-lml/x-gdb" ,
      ".gif":"image/gif" ,
      ".gps":"application/x-gps" ,
      ".gtar":"application/x-gtar" ,
      ".gz":"application/x-gzip" ,
      ".h":"text/plain" ,
      ".hdf":"application/x-hdf" ,
      ".hdm":"text/x-hdml" ,
      ".hdml":"text/x-hdml" ,
      ".hlp":"application/winhlp" ,
      ".hqx":"application/mac-binhex40" ,
      ".hta":"application/hta" ,
      ".htc":"text/x-component" ,
      ".htm":"text/html" ,
      ".html":"text/html" ,
      ".hts":"text/html" ,
      ".htt":"text/webviewhtml" ,
      ".ice":"x-conference/x-cooltalk" ,
      ".ico":"image/x-icon" ,
      ".ief":"image/ief" ,
      ".ifm":"image/gif" ,
      ".ifs":"image/ifs" ,
      ".iii":"application/x-iphone" ,
      ".imy":"audio/melody" ,
      ".ins":"application/x-internet-signup" ,
      ".ips":"application/x-ipscript" ,
      ".ipx":"application/x-ipix" ,
      ".isp":"application/x-internet-signup" ,
      ".it":"audio/x-mod" ,
      ".itz":"audio/x-mod" ,
      ".ivr":"i-world/i-vrml" ,
      ".j2k":"image/j2k" ,
      ".jad":"text/vnd.sun.j2me.app-descriptor" ,
      ".jam":"application/x-jam" ,
      ".jar":"application/java-archive" ,
      ".java":"text/plain" ,
      ".jfif":"image/pipeg" ,
      ".jnlp":"application/x-java-jnlp-file" ,
      ".jpe":"image/jpeg" ,
      ".jpeg":"image/jpeg" ,
      ".jpg":"image/jpeg" ,
      ".jpz":"image/jpeg" ,
      ".js":"application/x-javascript" ,
      ".jwc":"application/jwc" ,
      ".kjx":"application/x-kjx" ,
      ".lak":"x-lml/x-lak" ,
      ".latex":"application/x-latex" ,
      ".lcc":"application/fastman" ,
      ".lcl":"application/x-digitalloca" ,
      ".lcr":"application/x-digitalloca" ,
      ".lgh":"application/lgh" ,
      ".lha":"application/octet-stream" ,
      ".lml":"x-lml/x-lml" ,
      ".lmlpack":"x-lml/x-lmlpack" ,
      ".log":"text/plain" ,
      ".lsf":"video/x-la-asf" ,
      ".lsx":"video/x-la-asf" ,
      ".lzh":"application/octet-stream" ,
      ".m13":"application/x-msmediaview" ,
      ".m14":"application/x-msmediaview" ,
      ".m15":"audio/x-mod" ,
      ".m3u":"audio/x-mpegurl" ,
      ".m3url":"audio/x-mpegurl" ,
      ".m4a":"audio/mp4a-latm" ,
      ".m4b":"audio/mp4a-latm" ,
      ".m4p":"audio/mp4a-latm" ,
      ".m4u":"video/vnd.mpegurl" ,
      ".m4v":"video/x-m4v" ,
      ".ma1":"audio/ma1" ,
      ".ma2":"audio/ma2" ,
      ".ma3":"audio/ma3" ,
      ".ma5":"audio/ma5" ,
      ".man":"application/x-troff-man" ,
      ".map":"magnus-internal/imagemap" ,
      ".mbd":"application/mbedlet" ,
      ".mct":"application/x-mascot" ,
      ".mdb":"application/x-msaccess" ,
      ".mdz":"audio/x-mod" ,
      ".me":"application/x-troff-me" ,
      ".mel":"text/x-vmel" ,
      ".mht":"message/rfc822" ,
      ".mhtml":"message/rfc822" ,
      ".mi":"application/x-mif" ,
      ".mid":"audio/mid" ,
      ".midi":"audio/midi" ,
      ".mif":"application/x-mif" ,
      ".mil":"image/x-cals" ,
      ".mio":"audio/x-mio" ,
      ".mmf":"application/x-skt-lbs" ,
      ".mng":"video/x-mng" ,
      ".mny":"application/x-msmoney" ,
      ".moc":"application/x-mocha" ,
      ".mocha":"application/x-mocha" ,
      ".mod":"audio/x-mod" ,
      ".mof":"application/x-yumekara" ,
      ".mol":"chemical/x-mdl-molfile" ,
      ".mop":"chemical/x-mopac-input" ,
      ".mov":"video/quicktime" ,
      ".movie":"video/x-sgi-movie" ,
      ".mp2":"video/mpeg" ,
      ".mp3":"audio/mpeg" ,
      ".mp4":"video/mp4" ,
      ".mpa":"video/mpeg" ,
      ".mpc":"application/vnd.mpohun.certificate" ,
      ".mpe":"video/mpeg" ,
      ".mpeg":"video/mpeg" ,
      ".mpg":"video/mpeg" ,
      ".mpg4":"video/mp4" ,
      ".mpga":"audio/mpeg" ,
      ".mpn":"application/vnd.mophun.application" ,
      ".mpp":"application/vnd.ms-project" ,
      ".mps":"application/x-mapserver" ,
      ".mpv2":"video/mpeg" ,
      ".mrl":"text/x-mrml" ,
      ".mrm":"application/x-mrm" ,
      ".ms":"application/x-troff-ms" ,
      ".msg":"application/vnd.ms-outlook" ,
      ".mts":"application/metastream" ,
      ".mtx":"application/metastream" ,
      ".mtz":"application/metastream" ,
      ".mvb":"application/x-msmediaview" ,
      ".mzv":"application/metastream" ,
      ".nar":"application/zip" ,
      ".nbmp":"image/nbmp" ,
      ".nc":"application/x-netcdf" ,
      ".ndb":"x-lml/x-ndb" ,
      ".ndwn":"application/ndwn" ,
      ".nif":"application/x-nif" ,
      ".nmz":"application/x-scream" ,
      ".nokia-op-logo":"image/vnd.nok-oplogo-color" ,
      ".npx":"application/x-netfpx" ,
      ".nsnd":"audio/nsnd" ,
      ".nva":"application/x-neva1" ,
      ".nws":"message/rfc822" ,
      ".oda":"application/oda" ,
      ".ogg":"audio/ogg" ,
      ".oom":"application/x-AtlasMate-Plugin" ,
      ".p10":"application/pkcs10" ,
      ".p12":"application/x-pkcs12" ,
      ".p7b":"application/x-pkcs7-certificates" ,
      ".p7c":"application/x-pkcs7-mime" ,
      ".p7m":"application/x-pkcs7-mime" ,
      ".p7r":"application/x-pkcs7-certreqresp" ,
      ".p7s":"application/x-pkcs7-signature" ,
      ".pac":"audio/x-pac" ,
      ".pae":"audio/x-epac" ,
      ".pan":"application/x-pan" ,
      ".pbm":"image/x-portable-bitmap" ,
      ".pcx":"image/x-pcx" ,
      ".pda":"image/x-pda" ,
      ".pdb":"chemical/x-pdb" ,
      ".pdf":"application/pdf" ,
      ".pfr":"application/font-tdpfr" ,
      ".pfx":"application/x-pkcs12" ,
      ".pgm":"image/x-portable-graymap" ,
      ".pict":"image/x-pict" ,
      ".pko":"application/ynd.ms-pkipko" ,
      ".pm":"application/x-perl" ,
      ".pma":"application/x-perfmon" ,
      ".pmc":"application/x-perfmon" ,
      ".pmd":"application/x-pmd" ,
      ".pml":"application/x-perfmon" ,
      ".pmr":"application/x-perfmon" ,
      ".pmw":"application/x-perfmon" ,
      ".png":"image/png" ,
      ".pnm":"image/x-portable-anymap" ,
      ".pnz":"image/png" ,
      ".pot,":"application/vnd.ms-powerpoint" ,
      ".ppm":"image/x-portable-pixmap" ,
      ".pps":"application/vnd.ms-powerpoint" ,
      ".ppt":"application/vnd.ms-powerpoint" ,
      ".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation" ,
      ".pqf":"application/x-cprplayer" ,
      ".pqi":"application/cprplayer" ,
      ".prc":"application/x-prc" ,
      ".prf":"application/pics-rules" ,
      ".prop":"text/plain" ,
      ".proxy":"application/x-ns-proxy-autoconfig" ,
      ".ps":"application/postscript" ,
      ".ptlk":"application/listenup" ,
      ".pub":"application/x-mspublisher" ,
      ".pvx":"video/x-pv-pvx" ,
      ".qcp":"audio/vnd.qcelp" ,
      ".qt":"video/quicktime" ,
      ".qti":"image/x-quicktime" ,
      ".qtif":"image/x-quicktime" ,
      ".r3t":"text/vnd.rn-realtext3d" ,
      ".ra":"audio/x-pn-realaudio" ,
      ".ram":"audio/x-pn-realaudio" ,
      ".rar":"application/octet-stream" ,
      ".ras":"image/x-cmu-raster" ,
      ".rc":"text/plain" ,
      ".rdf":"application/rdf+xml" ,
      ".rf":"image/vnd.rn-realflash" ,
      ".rgb":"image/x-rgb" ,
      ".rlf":"application/x-richlink" ,
      ".rm":"audio/x-pn-realaudio" ,
      ".rmf":"audio/x-rmf" ,
      ".rmi":"audio/mid" ,
      ".rmm":"audio/x-pn-realaudio" ,
      ".rmvb":"audio/x-pn-realaudio" ,
      ".rnx":"application/vnd.rn-realplayer" ,
      ".roff":"application/x-troff" ,
      ".rp":"image/vnd.rn-realpix" ,
      ".rpm":"audio/x-pn-realaudio-plugin" ,
      ".rt":"text/vnd.rn-realtext" ,
      ".rte":"x-lml/x-gps" ,
      ".rtf":"application/rtf" ,
      ".rtg":"application/metastream" ,
      ".rtx":"text/richtext" ,
      ".rv":"video/vnd.rn-realvideo" ,
      ".rwc":"application/x-rogerwilco" ,
      ".s3m":"audio/x-mod" ,
      ".s3z":"audio/x-mod" ,
      ".sca":"application/x-supercard" ,
      ".scd":"application/x-msschedule" ,
      ".sct":"text/scriptlet" ,
      ".sdf":"application/e-score" ,
      ".sea":"application/x-stuffit" ,
      ".setpay":"application/set-payment-initiation" ,
      ".setreg":"application/set-registration-initiation" ,
      ".sgm":"text/x-sgml" ,
      ".sgml":"text/x-sgml" ,
      ".sh":"application/x-sh" ,
      ".shar":"application/x-shar" ,
      ".shtml":"magnus-internal/parsed-html" ,
      ".shw":"application/presentations" ,
      ".si6":"image/si6" ,
      ".si7":"image/vnd.stiwap.sis" ,
      ".si9":"image/vnd.lgtwap.sis" ,
      ".sis":"application/vnd.symbian.install" ,
      ".sit":"application/x-stuffit" ,
      ".skd":"application/x-Koan" ,
      ".skm":"application/x-Koan" ,
      ".skp":"application/x-Koan" ,
      ".skt":"application/x-Koan" ,
      ".slc":"application/x-salsa" ,
      ".smd":"audio/x-smd" ,
      ".smi":"application/smil" ,
      ".smil":"application/smil" ,
      ".smp":"application/studiom" ,
      ".smz":"audio/x-smd" ,
      ".snd":"audio/basic" ,
      ".spc":"application/x-pkcs7-certificates" ,
      ".spl":"application/futuresplash" ,
      ".spr":"application/x-sprite" ,
      ".sprite":"application/x-sprite" ,
      ".sdp":"application/sdp" ,
      ".spt":"application/x-spt" ,
      ".src":"application/x-wais-source" ,
      ".sst":"application/vnd.ms-pkicertstore" ,
      ".stk":"application/hyperstudio" ,
      ".stl":"application/vnd.ms-pkistl" ,
      ".stm":"text/html" ,
      ".svg":"image/svg+xml" ,
      ".sv4cpio":"application/x-sv4cpio" ,
      ".sv4crc":"application/x-sv4crc" ,
      ".svf":"image/vnd" ,
      ".svg":"image/svg+xml" ,
      ".svh":"image/svh" ,
      ".svr":"x-world/x-svr" ,
      ".swf":"application/x-shockwave-flash" ,
      ".swfl":"application/x-shockwave-flash" ,
      ".t":"application/x-troff" ,
      ".tad":"application/octet-stream" ,
      ".talk":"text/x-speech" ,
      ".tar":"application/x-tar" ,
      ".taz":"application/x-tar" ,
      ".tbp":"application/x-timbuktu" ,
      ".tbt":"application/x-timbuktu" ,
      ".tcl":"application/x-tcl" ,
      ".tex":"application/x-tex" ,
      ".texi":"application/x-texinfo" ,
      ".texinfo":"application/x-texinfo" ,
      ".tgz":"application/x-compressed" ,
      ".thm":"application/vnd.eri.thm" ,
      ".tif":"image/tiff" ,
      ".tiff":"image/tiff" ,
      ".tki":"application/x-tkined" ,
      ".tkined":"application/x-tkined" ,
      ".toc":"application/toc" ,
      ".toy":"image/toy" ,
      ".tr":"application/x-troff" ,
      ".trk":"x-lml/x-gps" ,
      ".trm":"application/x-msterminal" ,
      ".tsi":"audio/tsplayer" ,
      ".tsp":"application/dsptype" ,
      ".tsv":"text/tab-separated-values" ,
      ".ttf":"application/octet-stream" ,
      ".ttz":"application/t-time" ,
      ".txt":"text/plain" ,
      ".uls":"text/iuls" ,
      ".ult":"audio/x-mod" ,
      ".ustar":"application/x-ustar" ,
      ".uu":"application/x-uuencode" ,
      ".uue":"application/x-uuencode" ,
      ".vcd":"application/x-cdlink" ,
      ".vcf":"text/x-vcard" ,
      ".vdo":"video/vdo" ,
      ".vib":"audio/vib" ,
      ".viv":"video/vivo" ,
      ".vivo":"video/vivo" ,
      ".vmd":"application/vocaltec-media-desc" ,
      ".vmf":"application/vocaltec-media-file" ,
      ".vmi":"application/x-dreamcast-vms-info" ,
      ".vms":"application/x-dreamcast-vms" ,
      ".vox":"audio/voxware" ,
      ".vqe":"audio/x-twinvq-plugin" ,
      ".vqf":"audio/x-twinvq" ,
      ".vql":"audio/x-twinvq" ,
      ".vre":"x-world/x-vream" ,
      ".vrml":"x-world/x-vrml" ,
      ".vrt":"x-world/x-vrt" ,
      ".vrw":"x-world/x-vream" ,
      ".vts":"workbook/formulaone" ,
      ".wav":"audio/x-wav" ,
      ".wax":"audio/x-ms-wax" ,
      ".wbmp":"image/vnd.wap.wbmp" ,
      ".wcm":"application/vnd.ms-works" ,
      ".wdb":"application/vnd.ms-works" ,
      ".web":"application/vnd.xara" ,
      ".wi":"image/wavelet" ,
      ".wis":"application/x-InstallShield" ,
      ".wks":"application/vnd.ms-works" ,
      ".wm":"video/x-ms-wm" ,
      ".wma":"audio/x-ms-wma" ,
      ".wmd":"application/x-ms-wmd" ,
      ".wmf":"application/x-msmetafile" ,
      ".wml":"text/vnd.wap.wml" ,
      ".wmlc":"application/vnd.wap.wmlc" ,
      ".wmls":"text/vnd.wap.wmlscript" ,
      ".wmlsc":"application/vnd.wap.wmlscriptc" ,
      ".wmlscript":"text/vnd.wap.wmlscript" ,
      ".wmv":"audio/x-ms-wmv" ,
      ".wmx":"video/x-ms-wmx" ,
      ".wmz":"application/x-ms-wmz" ,
      ".wpng":"image/x-up-wpng" ,
      ".wps":"application/vnd.ms-works" ,
      ".wpt":"x-lml/x-gps" ,
      ".wri":"application/x-mswrite" ,
      ".wrl":"x-world/x-vrml" ,
      ".wrz":"x-world/x-vrml" ,
      ".ws":"text/vnd.wap.wmlscript" ,
      ".wsc":"application/vnd.wap.wmlscriptc" ,
      ".wv":"video/wavelet" ,
      ".wvx":"video/x-ms-wvx" ,
      ".wxl":"application/x-wxl" ,
      ".x-gzip":"application/x-gzip" ,
      ".xaf":"x-world/x-vrml" ,
      ".xar":"application/vnd.xara" ,
      ".xbm":"image/x-xbitmap" ,
      ".xdm":"application/x-xdma" ,
      ".xdma":"application/x-xdma" ,
      ".xdw":"application/vnd.fujixerox.docuworks" ,
      ".xht":"application/xhtml+xml" ,
      ".xhtm":"application/xhtml+xml" ,
      ".xhtml":"application/xhtml+xml" ,
      ".xla":"application/vnd.ms-excel" ,
      ".xlc":"application/vnd.ms-excel" ,
      ".xll":"application/x-excel" ,
      ".xlm":"application/vnd.ms-excel" ,
      ".xls":"application/vnd.ms-excel" ,
      ".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ,
      ".xlt":"application/vnd.ms-excel" ,
      ".xlw":"application/vnd.ms-excel" ,
      ".xm":"audio/x-mod" ,
      ".xml":"text/plain",
      ".xml":"application/xml",
      ".xmz":"audio/x-mod" ,
      ".xof":"x-world/x-vrml" ,
      ".xpi":"application/x-xpinstall" ,
      ".xpm":"image/x-xpixmap" ,
      ".xsit":"text/xml" ,
      ".xsl":"text/xml" ,
      ".xul":"text/xul" ,
      ".xwd":"image/x-xwindowdump" ,
      ".xyz":"chemical/x-pdb" ,
      ".yz1":"application/x-yz1" ,
      ".z":"application/x-compress" ,
      ".zac":"application/x-zaurus-zac" ,
      ".zip":"application/zip" ,
      ".json":"application/json"
    }
    //异步写法
    exports.getMime=function(fs,extname){ /*获取后缀名的方法*/

      //.html
        console.log('1');
        fs.readFile('./mime.json',function(err,data){

            if(err){
                console.log('mime.json文件不存在');
                return false;
            }
            //console.log(data.toString());

            var Mimes=JSON.parse(data.toString());

            //console.log(Mimes[extname]);
            console.log('2');
            return Mimes[extname] || 'text/html';

        })

        console.log('3');

    }

      码上加油站

      一起来加油

    长按扫码关注

    8de69a9b96f7b04f9c54340cc5a409d4.png记得点个在看哦!
    展开全文
  • 初始IP地址是192.168.1.111,通过对PB7的操作来实现缺省值和flash之间的切换,设置好的参数写入flash,w5500接的是SPI2,单片机是stm32f103c8t6。 第一个网页没有任何修改权限,只有输入登录密码(初始密码:123456 ...
  • Nginx入门之---实现web服务1.Nginx的优势a.发展趋势b.Logc.简介Nginx (engine x) 是一个高性能的HTTP(解决C10k的问题)和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。1.反代图示d.Nginx的优势http://1.IO多路复用...

    Nginx入门之---实现web服务

    1.Nginx的优势

    a.发展趋势

    eedc6a3b2f02a7b0f3619bfa1a85898b.png

    b.Log

    a3650a1483f405dbcffd2ac20f0b8e39.png

    c.简介

    Nginx (engine x) 是一个高性能的HTTP(解决C10k的问题)和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

    1.反代图示

    8afc36ec3cc7b430b3bc7f6b2313941e.png

    d.Nginx的优势

    http://1.IO多路复用

    a.理论方法

    第一种方法 ​ 最传统的多进程并发模型 (每进来一个新的I/O流会分配一个新的进程管理。) ​ 第二种方法 ​ I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流 。) 发明它的原因,是尽量多的提高服务器的吞吐能力。 在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流

    7c46d3397040025f29d513ccdf52cf39.png

    b.技术类型

    1.select(了解)

    select是第一个实现 (1983 左右在BSD里面实现的)。 select 被实现以后,很快就暴露出了很多问题。 • select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。 • select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数 据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍... • select 只能监视1024个链接。 • select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,这个sock不用,要收 回,这个select 不支持的,如果你丧心病狂的竟然关掉这个sock, select的标准行为是不可预测的

    2. poll (了解)

    于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如 • poll 去掉了1024个链接的限制,于是要多少链接呢, 主人你开心就好。 • poll 从设计上来说,不再修改传入数组,不过这个要看你的平台了,所以行走江湖,还是小心为妙。 其实拖14年那么久也不是效率问题, 而是那个时代的硬件实在太弱,一台服务器处理1千多个链接简直就是神 一样的存在了,select很长段时间已经满足需求。 但是poll仍然不是线程安全的, 这就意味着,不管服务器有多强悍,你也只能在一个线程里面处理一组I/O流。 你当然可以那多进程来配合了,不过然后你就有了多进程的各种问题。

    3.epoll(了解)

    于是5年以后, 在2002, 大神 Davide Libenzi 实现了epoll. epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题, 比如: • epoll 现在是线程安全的。 • epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。 ​ 特点: ​ 异步,非阻塞 ​ $ pstree |grep nginx ​ |-+= 81666 root nginx: master process nginx ​ | |--- 82500 nobody nginx: worker process ​ | --- 82501 nobody nginx: worker process ​ 1个master进程,2个work进程 ​ 每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么一直等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。这就是异步。此时,如果再有request 进来,他就可以很快再按这种方式处理。这就是非阻塞和IO多路复用。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。这就是异步回调。

    2.时分多路复用

    CPU时钟/中断设计

    3.频分多路复用

    ADSL


    高并发 IO多路复用 epoll 异步 非阻塞 nginx的优点总结!!!

    2.Nginx 部署-Yum

    官网链接

    http://www.nginx.org

    Nginx版本类型

    Mainline version: 主线版,即开发版

    Stable version: 最新稳定版,生产环境上建议使用的版本

    23ee681065c03078bad98e600af5932a.png

    Legacy versions: 遗留的老版本的稳定版

    配置YUM源

    1.12

    官方图示

    eeaaca6bf9553d66a0505b88ae693fca.png

    操作示范

    36d30bfaa8cc9dafd3574b91a6db7e1b.png

    1.15

    RHEL/CentOS
    ​
    Install the prerequisites:
    ​
        sudo yum install yum-utils
    ​
    To set up the yum repository, create the file named /etc/yum.repos.d/nginx.repo with the following contents:
    ​
        [nginx-stable]
        name=nginx stable repo
        baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
        gpgcheck=1
        enabled=1
        gpgkey=https://nginx.org/keys/nginx_signing.key
    ​
        [nginx-mainline]
        name=nginx mainline repo
        baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
        gpgcheck=1
        enabled=0
        gpgkey=https://nginx.org/keys/nginx_signing.key
    ​
    By default, the repository for stable nginx packages is used. If you would like to use mainline nginx packages, run the following command:
    ​
        sudo yum-config-manager --enable nginx-mainline
    ​
    To install nginx, run the following command:
    ​
        sudo yum install nginx
    ​
    When prompted to accept the GPG key, verify that the fingerprint matches 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62, and if so, accept it. 

    1.161.17 .....

    安装

    环境问题

    getenforce

    systemctl status firewalld

    yum -y install nginx
    ​
    systemctl start nginx
    ​
    systemctl enable nginx
    ​
    nginx -V
        查看安装附带的功能模块

    测试

    dc3318c853afe848db6e0f4943050c24.png

    地址栏输入服务器IP地址。

    展开全文
  • 接下来我们介绍一下,如何来使用容器,如何将我们编写的一个web程序放置在容器内运行。要做这件事情,需要准备的工作有:首先要有一个ubuntu的虚拟机(或macos),Go语言的运行环境,Docker已经安装完成。我们的应用...
  • stm32+w5500web服务器页面需要引用js文件,js文件怎么放进去,相关实验例程中显示板子网关配置的静态页面,我看也引用了W5500.js,这个js文件完全没有找到,但是程序没有问题,我现在想在网页中显示图表,需要引用...
  • STM32 W5500 HTTP Server 微型web服务实现

    千次阅读 热门讨论 2020-04-22 00:09:27
    嵌入式Web服务很常见,比如电脑通过WIFI接入网络,在浏览器地址栏输入 "192.168.1.1",或者其他...STM32 W5500几乎也可以实现上述的功能,但是由于STM32的RAM和FLASH储存大小是有限的,实现一个简单的web服务是没...
  • 这篇文章是系列文章《Web 应用快捷键支持》的第三篇。前两篇文章中介绍了如何正确处理浏览器 Keyboard Event。今天我们一起来看看,如何把正确解析的键盘事件,映射到对应的命令上。在 VS Code 中,用户有两种方式...
  • 通过EEPROM存储修改的IP,MAC,子网掩码,网页同步Windows时间,AJAX刷新网页修改的参数
  • WIZnet活动主题:嵌入式WEB服务器搭建及HTTP(S)协议讲解-W5500封装库.rar
  • WIZnet活动主题:嵌入式WEB服务器搭建及HTTP(S)协议讲解-W5500io原理图.pdf
  • WIZnet活动主题:嵌入式WEB服务器搭建及HTTP(S)协议讲解-ONENET_W5500_接入(HTTP).pdf
  • 浏览器配置就是在电路板上搭载一个嵌入式的web服务器,所以功能一般的很有限。 特定情况下,搭载一个浏览器设置接口,可以大大方便设备的使用,毕竟是个电脑就肯定有浏览器的。 2.W5500浏览器配置例程分析 1)...
  • 支持wifi以太网双网络通信,支持阿里云MQTT通信,数据上传到阿里生活平台,阿里云... onenet WEB界面 onenet 手机界面:下载onenet设备云app即可app控制监控。     阿里云IOT studio WEB界面:  
  • <p>I tried some example code (WebServer from GitHub) with the Ethernet.h and Ethernet2.h --> no success. The Ethernetboard is working, because I use that with an Arduino NANO. After some research ...
  • WIZ550web 是WIZnet最新推出的嵌入式网页服务器模块,基于全硬件TCP/IP以太网芯片W5500,用户可以通过网页在模块上控制/监控 16个可配置数字 I/O 及4个ADC. WIZ550web 可以根据用户使用目的,提供基础固件/网页实例...
  • W Arduino Web服务器库。 文献资料 1.入门 2.指导 3. API参考 兼容性 aWOT Web服务器库旨在与所有... ESP32 + Wiznet W5500以太网 ESP32 + LAN8270以太网 ESP32 WiFi ESP8266 WiFi ESP32和ESP8266 WiFi 在两个ESP Ar
  • 网络上关于Arduino Ethernet的教程不多,刚刚入门的伙伴们,先给大家提供一...Arduino官方的以太网板采用的是WIZnet-W5100,而目前市场上也有很多结合最新的W5500的Arduino Ethernet板。如下例程都是适用的。 转
  • fuhome实现微信语音控制单片机设备,任何网络设备均可ESP8266,W5500,ENC28J60,SIM900A这些网络模块都可以,因为原理只需要能发送接收UDP数据包即可实现远程控制 首先设备介入fuhome.net未来之家实验室,可以用web,...
  • 《搭建属于你的在线实时采集系统》中已经对HTML5平台有了初步的认识,并基于此向大家展示了如何将采集到的数据上传至网络,实现实时观测。HTML 5是近十年来Web开发标准最巨大的飞跃。...b) 以太网控制器:W5500,SP
  • <div><p>Hello there!...<ul><li>The platform will also print the loaded payload from the response web server, so I can verify that I loaded the entire string from the web server with JSON data ...
  • * @brief web服务器现在的内容 * @attention ****************************************************************************** **/ #ifndef __WEBPAGE_H #define __WEBPAGE_H #define INDEX_HTML "<!DOCTYPE ...
  • <p>2.ESP32 pico kit with SPI Wiznet W5500. Board package ESP32 1.0.4 is installed <ol><li> <p>My test program is running, with web server and MQTT </li><li> <p>Delete the ArduinoOTA directory in D: \ ...

空空如也

空空如也

1 2
收藏数 25
精华内容 10
关键字:

w5500web