Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它使用了一个事件驱动、非阻塞式I/O的模型。
Node是一个让JavaScript运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。

NodeJs的安装

  • 方法一
1
2
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
  • 方法二
  1. 下载压缩包
    wget https://nodejs.org/dist/v8.1.0/node-v8.1.0-linux-x64.tar.xz

  2. 解压
    tar -xvf node-v8.1.0-linux-x64.tar.xz

  3. 切换并查看当前node所在路径
    cd node-v8.1.0-linux-x64/bin
    pwd

  4. 查看node版本
    ./node -v

  5. 将node和npm设置为全局
    sudo ln /home/ubuntu/node-v8.1.0-linux-x64/bin/node /usr/local/bin/node
    sudo ln /home/ubuntu/node-v8.1.0-linux-x64/bin/npm /usr/local/bin/npm
    pwd

推荐使用方法一,直接安装在系统环境/usr/bin目录下,之后使用npm -g安装其他插件也会安装到/usr/lib/node_modules’(需要使用sudo权限)‘。如果使用方法二,将nodejs路径链接到/usr/local/bin目录下,则每次npm-g安装插件都会安装在nodejs原路径下的node_modules(比如/home/ubuntu/node-v8.1.0-linux-x64/lib/node_modules),每次代码中引用插件也需要到此目录下去找。

NodeJs下的Socket

websocket

WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器。

  • 打开websocket
1
2
3
4
var Socket = new WebSocket(url,[protocol]);
第一个参数url, 指定连接的URL。第二个参数protocol是可选的,指定了可接受的子协议。

如: var Socket = new WebSocket('ws://localhost:3000/test');
  • WebSocket事件
    我们使用了以上代码创建了Socket对象:
1
2
3
4
5
事件	         事件处理程序	                描述
open Socket.onopen 连接建立时触发
message Socket.onmessage 客户端接收服务端数据时触发
error Socket.onerror 通信发生错误时触发
close Socket.onclose 连接关闭时触发
  • WebSocket 方法
1
2
3
4
方法	                           描述
Socket.send() 使用连接发送数据

Socket.close() 关闭连接

socketio

Socket.io实际上是WebSocket的父集,Socket.io封装了WebSocket和轮询等方法,会根据情况选择方法来进行通讯。

利用websocket做一个简易聊天室

  • 下载Visual Studio Code

    Visual Studio Code由微软出品,但它不是那个大块头的Visual Studio,它是一个精简版的迷你Visual Studio,并且,Visual Studio Code可以跨平台!Windows、Mac和Linux通用。

    点击官网下载

  • 使用Visual Studio Code

    • 新建一个目录websocket,在终端进入此目录,然后建立一个websocket依赖。
    1
    2
    $  npm -i nodejs-websocket  --save
    此文件夹就会自动生成node-modules文件夹和package-lock.json
    • 在websocket目录下,新建服务端app.js

    • 在websocket目录下,新建公共文件夹public,然后在此文件夹中新建一个index.html作为聊天的页面

    • 本来要写客户端client.js,不过此js可以直接写在index.html里。

    点击详细代码,查看源码。

利用socketio做一个简易聊天室

  • 新建一个目录socketio,在终端进入此目录,然后生成信息,建立一些依赖。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ npm init        或者使用   $ npm init -y  忽略以下,直接生成。
Press ^C at any time to quit.
package name: (socketio) ()里为默认,直接enter进入下一个
version: (1.0.0)
description:
entry point: (index.js) server.js
test command:
git repository:
keywords:
author: raoweijia
license: (ISC)
About to write to /home/raoweijia/桌面/socketio/package.json:
{
"name": "socketio",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "raoweijia",
"license": "ISC"
}
Is this OK? (yes) yes

执行完后会在当前目录下建立一个package.json。
1
2
3
4
5
建立express、socketio依赖。
$ npm install express --save
$ npm install socket.io --save

此文件夹就会自动生成node-modules文件夹和package-lock.json,并把相关的信息放入其中。
  • 语法
1
2
3
4
var app = require('express')();
等价于
const express = require('express');
const app = express();
1
2
3
var server = require('http').Server(app);
等价于
const server = require('http').createServer(app);
1
2
3
var io = require('socket.io')(server);
等价于
const io = require('socket.io').listen(server);
1
2
3
server.listen(3000);
等价于
server.listen(process.env.PORT || 3000);
  • 引入一些样式
1
2
3
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="/socket.io/socket.io.js"></script> (没有,就要创建socke.io.js)

点击详细代码,查看源码。

拓展

  • let,const,var三个定义变量之间的区别

    • var
    1
    2
    3
    4
    5
    6
    for (var i = 0; i < 10; i++) {
    console.log(i);
    }
    alert(i)

    在javascript中没有块级作用域,在for()里面定义变量i ,在循环外部依然可以进行正常访问。
    1
    2
    3
    4
    5
    var i = 15;
    var i = 5;
    alert(i);//5 

    其中变量i重复定义没有报错,反而输出值为5,说明被复写了。
    1
    2
    3
    4
    5
    6
    7
    for (var i = 0; i < 3; i++) {
    setTimeout(function () {
    console.log(i)
    }, 1000);
    }
      
    输出结果为3,3,3,因为当循环结束时,i的值为三。所以在执行setTimeout函数时会打印三次3。
    • let

    它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,声明的常量,不可重复声明。。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
    let a = 10;
    var b = 1;
    }

    a // ReferenceError: a is not defined.
    b // 1

    或者
    for (let i = 0; i < 10; i++) {
    // ...
    }
    console.log(i); // ReferenceError: i is not defined
    1
    2
    3
    4
    5
    6
    7
    8
    使用var命令,变量可以在声明之前使用,值为undefined。let命令改变了这个语法,它所声明的变量一定要在声明后使用,否则报错。
    // var 的情况
    console.log(foo); // 输出undefined
    var foo = 2;

    // let 的情况
    console.log(bar); // 报错ReferenceError
    let bar = 2;
    • const

    const声明一个只读的常量。一旦声明,常量的值就不能改变。
    对于const来说,只声明不赋值,就会报错。const的作用域与let命令相同:只在声明所在的块级作用域内有效。
    const声明的常量,也与let一样不可重复声明。