zoukankan      html  css  js  c++  java
  • http服务器开发笔记(一)——先跑起来

    做了很多年的web相关开发,从来也没有系统的学习http协议,最近正好工作不怎么忙,准备系统的学习一下。

    接下来准备自己写一小型的http服务器来学习,因为现在对JavaScript比较熟悉,所以决定用node.js来编写。

    实际上node.js已经内置http服务器的相关接口直接调用就能处理http相关请求啦(nodejs的http文档),但我要从头开发所以不使用这个接口,而是直接操作socket来开发。

    node.js的socket相关接口在net包里面,下面先让服务器运行起来,先上代码。

    代码使用了es6语法,不了解的朋友可以看看阮一峰写的教程ECMAScript 6 入门;如果对http协议也不了解可以看看《图解HTTP》这本书。

    // httpserver.js
    const net = require('net') // 建立socket服务器 const server = net.createServer() // 监听网络连接请求 server.on('connection', (socket) => { // 监听socket接收数据事件 socket.on('data', (data)=> { // 响应实体数据 data =  Buffer.from('你好! HTTP') // 响应首部数据 head = ` HTTP/1.1 200 OK Content-Length: ${data.length} Content-Type: text/html ` content = `${head} ${data.toString()}`// 返回响应数据 socket.end(content) }) }) // 监听9001端口 server.listen(9001, () => { console.log('opened server on', server.address()) })

    在命令行输入 node httpserver.js 这样一个最简单的http服务器就运行起来了,在本机浏览器访问 localhost:9001 看看是不是显示了 “你好! HTTP”。

    这段代码一共做了这么几件事

    1. 建立一个socket服务器,监听9001端口的请求
    2. 监听网络连接请求
    3. 生成http响应首部字段和响应实体数据

    对于http来说最重要的就是生成http响应数据了,下面一张显示了http请求和响应数据的格式

    下面这段就是响应报文首部:

    HTTP/1.1 200 OK                 // 告诉浏览器服务器支持HTTP/1.1  返回码200表示请求被正常处理 (返回码有很多以后会用到)
    Content-Length: ${data.length}  // 返回数据的长度(字节)
    Content-Type: text/html         // 返回内容的数据类型(返回数据类型也有很多以后也会用到)

    有几点必须注意:

    • 字段间换行符用的是 ,从每二行开始头和换行符之间千万不要加空格或其它不可见字符,我在几个主流浏览器上测试没有一个能正常解析的。

        加空格是这个样子

        

        不加空格是这个样子

         

    • 字段Content-Length单位是字节,如果返回报文主体数据时包含中文,不能直接使用String的length属性,length会把1个汉字长度认为是1会显示不全。这个字段不加的话大多数浏览器也能正确显示, 如果长度不对会显示不全。

    报文首部下面就是报文主体了,首部和主体之间也是就 分割的,主体和换行符之间什么字符都不要加,否则会把字符算到报文主体里面。

    到这里可能会有疑问,既然都用 分割那么如何判断哪个是报文首部哪个是主体部分呢,其实主体前面有两对 ,浏览器就是根据这个判断的。

    可以只用一对 试试,会看到浏览器不会正常显示 “你好! HTTP”的。


    转载请注明出处:http://www.cnblogs.com/oliverliye/p/6424188.html

  • 相关阅读:
    Xenu Link Sleuth简单使用
    C#简单游戏外挂制作(以Warcraft Ⅲ为例)
    Silverlight InkPresenter 实现路径回放的探索
    Microsoft Virtual Earth Silverlight Map Control (CTP)快速上手
    【Azure实例】有趣的Silverlight应用:录播简笔画
    Azure Services Platform 入门系列文章索引页
    javascript原型的类继承
    javascript给类添加的方法
    checkbox 全选
    【nodejs】 在 Ubuntu 12.04 安裝 Node.js【转】
  • 原文地址:https://www.cnblogs.com/oliverliye/p/6424188.html
Copyright © 2011-2022 走看看