【nodejs学习】2.网络相关

1.官方文档的一个小例子

//http是内置模块

var http = require(‘http‘);

http.createServer(function(request, response){

response.writeHead(200, {‘Content-Type‘:‘text-plain‘});

response.end(‘hello World\n‘);

}).listen(8124);

.createServer创建服务器,.listen方法监听端口

HTTP请求是一个数据流,由请求头,请求体组成。

POST / HTTP/1.1
User-Agent: curl/7.26.0
Host: localhost
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded

Hello World

2.请求发送解析数据

HTTP请求在发送给服务器时,可以按照从头到尾的一个顺序一个字节一个自己地以数据流方式发送,http模块创建的HTTP服务器在接收到完整的请求头后,就回调用回调函数,在回调函数中,除了可以用request对象访问请求头数据外,还能把request对象当做一个只读数据流访问具体请求体的数据。

var http = require(‘http‘);
http.createServer(function(request, response){

var body = [];

console.log(request.method);

console.log(request.headers);

request.on(‘data‘, function(chunk){

body.push(chunk+‘\n‘);   
    });   
    response.on(‘end‘, function(){       
        body = Buffer.concat(body);       
        console.log(body.toString());   
    });

}).listen(3001);

//response写入请求头数据和实体数据

var http = require(‘http‘);

http.createServer(function(request, response){

response.writeHead(200, {‘Content-Type‘:‘text/plain‘});

request.on(‘data‘, function(chunk){

response.write(chunk);

});

request.on(‘end‘, function(){

response.end();

});

}).listen(3001);

3.客户端模式:

var http = require(‘http‘);

var options = {

hostname: ‘www.renyuzhuo.win‘,

port:80,

path:‘/‘,

method:‘POST‘,

headers:{

‘Content-Type‘:‘application/x-www-form-urlencoded‘

}

};

var request = http.request(options, function(response){

console.log(response.headers);

});

request.write(‘hello‘);

request.end();

//GET便捷写法

http.get(‘http://www.renyuzhuo.win‘, function(response){});

//response当做一个只读数据流来访问

var http = require(‘http‘);

var options = {

hostname: ‘www.renyuzhuo.win‘,

port:80,

path:‘/‘,

method:‘GET‘,

headers:{

‘Content-Type‘:‘application/x-www-form-urlencoded‘

}

};

var body=[];

var request = http.request(options, function(response){

console.log(response.statusCode);

console.log(response.headers);

response.on(‘data‘, function(chunk){

body.push(chunk);

});

response.on(‘end‘, function(){

body = Buffer.concat(body);

console.log(body.toString());

});

});

request.write(‘hello‘);

request.end();

https:https需要额外的SSL证书

var options = {

key:fs.readFileSync(‘./ssl/dafault.key‘),

cert:fs.readFileSync(‘./ssl/default.cer‘)

}

var server = https.createServer(options, function(request, response){});

//SNI技术,根据HTTPS客户端请求使用的域名动态使用不同的证书

server.addContext(‘foo.com‘, {

key:fs.readFileSync(‘./ssl/foo.com.key‘),

cert:fs.readFileSync(‘./ssl/foo.com.cer‘)

});

server.addContext(‘bar.com‘,{

key:fs.readFileSync(‘./ssl/bar.com.key‘),

cert:fs.readFileSync(‘./ssl/bar.com.cer‘)

});

//https客户端请求几乎一样

var options = {

hostname:‘www.example.com‘,

port:443,

path:‘/‘,

method:‘GET‘

};

var request = https.request(options, function(response){});

request.end();

4.URL

http: // user:pass @ host.com : 8080 /p/a/t/h ?query=string #hash

-----      ---------          --------         ----   --------     -------------       -----

protocol     auth      hostname    port pathname     search     hash

.parse方法将URL字符串转换成对象

url.parse("http: // user:pass @ host.com : 8080 /p/a/t/h ?query=string #hash);

/*

Url

{

protocol: ‘http:‘,

slashes: null,

auth: null,

host: null,

port: null,

hostname: null,

hash: ‘#hash‘,

search: ‘?query=string%20‘,

query: ‘query=string%20‘,

pathname: ‘%20//%20user:pass%[email protected]%20host.com%20:%208080%20/p/a/t/h%20‘,

path: ‘/p/a/t/h?query=string‘,

href: ‘http://user:[email protected]:8080/p/a/t/h?query=string#hash‘

}

*/

.parse还支持第二个第三个参数,第二个参数等于true,返回的URL对象中query不再是一个字符串,而是一个经过querystring模板转换后的参数对象,第三个参数等于true,可以解析不带协议头的URL例如://www.example.com/foo/bar

.resolve方法可以用于拼接URL。

5.Query String

URL参数字符串与参数对象的互相转换。

querystring.parse(‘foo=bar&baz=qux&baz=quux&corge‘);

/*=>

{foo:‘bar‘,baz:[‘qux‘,‘quux‘],coge:‘‘}

*/

querystring.stringify({foo:‘bar‘,baz:[‘qux‘, ‘quux‘],corge:‘‘});

/*=>

‘foo=bar&baz=qux&baz=quux&corge‘

*/

6.Zlib

数据压缩和解压的功能。如果客户端支持gzip的情况下,可以使用zlib模块返回。

http.createServer(function(request, response){

var i = 1024, data = ‘‘;

while(i--){

data += ‘.‘;

}

if((request.headers[‘accept-eccoding‘]||‘‘).indexOf(‘gzip‘)!=-1){

zlib.gzip(data, function(err, data){

response.writeHead(200, {

‘Content-Type‘:‘text/plain‘,

‘Content-Encoding‘:‘gzip‘

});

response.end(data);

});

}else{

response.writeHead(200, {

‘Content-Type‘:‘text/plain‘

});

response.end(data);

}

}).listen(3001);

判断服务端是否支持gzip压缩,如果支持的情况下使用zlib模块解压相应体数据。

var options = {

hostname:‘www.example.com‘,

port:80,

path:‘/‘,

method:‘GET‘,

headers:{

‘Accept-Encoding‘:‘gzip,deflate‘

}

};

http.request(options, function(response){

var body = [];

response.on(‘data‘, function(chunk){

body.push(chunk);

});

response.on(‘end‘, function(){

body = Buffer.concat(body);

if(response.headers[] === ‘gzip‘){

zlib.gunzip(body, function(err, data){

console.log(data.toString());

});

}else{

console.log(data.toString());

}

});

});

7.Net

net可创建Socket服务器与Socket客户端。从Socket层面来实现HTTP请求和相应:

//服务器端

net.createServer(function(conn){

conn.on(‘data‘, function(data){

conn.write([

‘HTTP/1.1 200 OK‘,

‘Content-Type:text/plain‘,

‘Content-length: 11‘

‘‘,

‘Hello World‘

].join(‘\n‘));

});

}).listen(3000);

//客户端

var options = {

port:80,

host:‘www.example.com‘

};

var clien = net.connect(options, function(){

clien.write([

‘GET / HTTP/1.1‘,

‘User-Agent: curl/7.26.0‘,

‘Host: www.baidu.com‘,

‘Accept: */*‘,

‘‘,

‘‘

].join(‘\n‘));

});

clien.on(‘data‘, function(data){

console.log(data.toString());

client.end();

});

时间: 2024-10-17 14:04:46

【nodejs学习】2.网络相关的相关文章

nodejs学习资料

NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS

NodeJS学习指南

七天学会NodeJS NodeJS基础 什么是NodeJS 有啥用处 如何安装 安装程序 编译安装 如何运行 权限问题 模块 require exports module 模块初始化 主模块 完整示例 二进制模块 小结 代码的组织和部署 模块路径解析规则 包(package) index.js package.json 命令行程序 Linux Windows 工程目录 NPM 下载三方包 安装命令行程序 发布代码 版本号 灵机一点 小结 文件操作 开门红 小文件拷贝 大文件拷贝 API走马观花

七天学会NodeJS (原生NodeJS 学习资料 来自淘宝技术团队)

NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS

nodejs学习过程2之相关网站2

nodejs学习过程2之相关网站2 全文来自于知乎 链接:https://www.zhihu.com/question/21567720/answer/201301150来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一.第一篇 以前学习 Node 尽管也能感觉到自己在不断进步,但是直到使用 Node 完成了一些有意思的项目之后才算系统掌握 Node. 使用 Node 来写 Web 方面的东西还挺有意思的,会碰到一些问题,在解决这些问题的过程中掌握 Node 是比

Java学习之网络编程实例

转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码

nodejs学习笔记(基于v7.4.0)

nodejs学习笔记 一.buffer: 全局对象(单例   Buffer.from   Buffer.alloc   Buffer.allocUnsafe ) 编码类型 描述 ascii 仅仅用于7位ascall数据编码,速度快,如果设置了将会剥离高位 utf8 多字节的编码的Unicode字符,网页文档大部分默认都为它. utf16le 小端编码的Unicode字符,2或者4个字节 ucs2 utf16le的别名 base64 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之

nodejs学习笔记之安装、入门

由于项目需要,最近开始学习nodejs.在学习过程中,记录一些必要的操作和应该注意的点. 首先是如何安装nodejs环境?(我用的是windows 7环境,所以主要是windows 7的例子.如果想看linux下的安装可以参考http://www.cnblogs.com/meteoric_cry/archive/2013/01/04/2844481.html) 1. nodejs提供了一些安装程序,可以去官网(http://nodejs.org/download/)按照自己的机器进行下载,下载完

NodeJS学习资料合集

1. 官网 nodejs 2.  How do I get started with Node.js,stackoverflow提问,收集很多有用的站点 3.  node-books,github收集很多node相关书籍,可以clone下来 4.  Nblog,nodejs+express+mongodb实现的博客学习教程,有中文文档 5.  cnode,中文nodejs学习论坛 6. node debug,介绍几种如何调试nodejs方法 7. GitHub最受关注的前端大牛,好几个是Node

linux网络相关配置文件

linux网络相关配置文件 linux系统一般来说分为两大类:1.RedHat系列:Redhat.Centos.Fedora等:2.Debian系列:Debian.Ubuntu等. linux系统中,TCP/IP网络是通过若干个文本文件来进行配置的,需要配置这些文件来联网,下面对linux两大类系统中基本的TCP/IP网络配置文件做学习总结. 第一类Debian中Ubuntu系统为例 Ubuntu系统的网络配置文件有interfaces,resolv.conf等. 一.网络接口配置文件:/etc

【Socket编程】Java中网络相关API的应用

Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出一个对象: InetAddress类可以通过InetAddress类的静态方法获得InetAddress的对象: 1 InetAddress.getLocalHost();//获取本地对象 2 InetAddress.getByName("");//获取指定名称对象 主要方法使用: 1 /