zoukankan      html  css  js  c++  java
  • NodeJs

    Nodejs官方文档

    https://nodejs.org/en/
    https://nodejs.org/en/docs/

    Nodejs的特征: 

    1、采用非阻塞性IO机制;—— 不需要担心造成死锁

    2、只支持单线程;

    3、事件环;

     类

    class User {
        constructor(data) {
            super(data);
        }
    }

    require 加载模块

    var express = require('express');
    var fs = require('fs');
    var path = require('path');
    var http = require('http');

    练习1:本地服务器

    var app = express();
    var config = require('./config/config.js');
    app = config(app);
    app.listen();    //启动监听端口
    console.log("端口已启动");

    练习2:读写文本

    //读取文本
    fs.readFile(path.join(__dirname,'/data/test.json'),{encoding:'utf-8'},function(err,data){
        
        if(err) throw err;
        
         console.log(data);
    
    });
    
    //写入文本
    fs.writeFile(path.join(__dirname,'/data/test.json'),"Hello World",function(err){
        
        if(err) throw err;
        
         console.log("OK");
    
    });

    练习3:创建简单的http服务器

    http.createServer(function(request,response){
        response.writeHead(200,{'Content-Type':'text/plain'});
        response.end('Hello World!');
    }).listen('6634');
    
    
    console.log("server runing");

    练习4:常规断点调试

    http.createServer(function(request,response){
        response.writeHead(200,{'Content-Type':'text/plain'});
        debugger
        response.end('Hello World!');
    }).listen('6634');

    练习5:超级调试

    先下载安装插件

    sudo npm install -g node-inspector

    启动插件

    node-inspector

    新建控制台

    command+n

    启动练习4的项目

    node --debug app.js

    google浏览器:http://localhost:8080/debug?port=5858

     

     

    发送get/post请求

    推荐配合request-promise使用。使用promise风格比较利于开发

    https://github.com/request/request-promise

    var _request = require('request');
    
    # get请求示例
    exports.load_AJAX = function(callback)
    {
        _request.get('http://localhost/json2.php',function(err,response,body)
        {
            if(response.statusCode = '200')
            {
                callback(body);
            }
        })
    }
    
    # post请求示例
    var post_data = function(callback)
    {
        _request.post('http://localhost/json2.php',{
            'key':'lovemp',
            'name':'lee'
        },function(err,response,body){
            if(response.statusCode = '200')
            {
                callback(body);
            }
        })
    }
    
    # request支持application/x-www-form-urlencoded和multipart/form-data实现表单上传。不用操心设置header之类的琐事,request会帮你解决。
    _request.post(API_SERVER, {form:{
            UserId: 'A6F28BA9C3BDA307',
            MethodName: 'user_info'
        }},(err, response, body) => {            
            console.log(response.statusCode,err,response,body);        
    })
    
    
    # 使用promise风格 : https://github.com/request/request-promise
    var rp = require('request-promise');
    var options = {
                method: 'POST',
                uri: API_SERVER,
                form:{
                    UserId: 'A6F28BA9C3BDA307',
                    MethodName: 'user_info'
                },
                headers: {
                    /* 'content-type': 'application/x-www-form-urlencoded' */ // Set automatically
                }
            };
    
    rp(options) .then(function (body) {
        // POST succeeded...
        console.log(body)
    })
    .catch(function (err) {
        // POST failed...
        console.log(err)
    });
    
    # 同上
    var rp = require('request-promise');
    rp.post(API_SERVER, {form:{
            UserId: 'A6F28BA9C3BDA307',
            MethodName: 'user_info'
    }}).then( (body) => {
        console.log(body)
    }).catch(function (err) {
        console.log(err)
    });

      

    express - RESTful API

    "use strict";
    const express = require('express');
    const fs = require('fs');
    const url = require('url');
    
    let app = express();
    let port = 8090;
    let result = "";
    
    
    // all、get、post三种方式
    app.all('/ajax/menu/:id', function (req, res) {
        res.header('Access-Control-Allow-Origin', '*');
        res.header("Content-Type", "text/plain;charset=utf-8");
        let id = req.params.id;
        if(req.url!=="/favicon.ico" && !isNaN(id)) {
           result = {state:"200",msg:"success",result:fs.readFileSync("../data/menu.json", 'utf8')}; 
        } else {
            result = {state:"500",msg:"shoperId is not defined"}
        }
        res.end(JSON.stringify(result));
    })
    var server = app.listen(port, function () { console.log("Server Start!"); })

    爬虫

    需要下载三个依赖

    sudo npm install express superagent cheerio --save-dev

    知识点: express 新建本地服务器, superagent 发送get/post请求, cheerio 我最喜欢的nodejs版本的jquery,res.send 发送到页面

    const express = require('express')
    const superagent = require('superagent')
    const cheerio = require('cheerio')
    var app = express()
    var resultArr = []
    app.get('/', (req,res,next) => {
      superagent.get('https://cnodejs.org/').end((err, response) => {
        if(err) console.log(err)
        let $ = cheerio.load(response.text)
        $('#topic_list .topic_title').each((index,element) => {
          let resultObj = {
              title: '',
              href: ''
          }
          resultObj.title = $(element).attr('title')
          resultObj.href = $(element).attr('href')
          resultArr.push(resultObj)
        })
        res.send(resultArr)
      })
    })
    
    app.listen(process.env.PORT || 8090)
    console.log('Server Start!')

    解决charset、encoding  gb2312的问题

    https://www.cnblogs.com/CyLee/p/9557109.html

    // npm i request cheerio iconv-lite
    const request = require('request');
    const cheerio = require('cheerio');
    const iconv = require('iconv-lite');
    
    request({
        url: 'http://roll.mil.news.sina.com.cn/col/zgjq/index.shtml',
        encoding : null
    }, function (err, response, body) {
        if (err) throw new Error(err.message);
        var str = iconv.decode(response.body, 'GBK').toString();
        console.log(20180829214413, str)
    });

    爬虫简单版

    const superagent = require('superagent')
    const cheerio = require('cheerio')
    
    superagent.get('http://localhost:8080/inde_x.html').end((err, response) => {
        // 注意属性可以防止unicode编码
        const $ = cheerio.load(response.text, {decodeEntities: false})
    
        // 报告编号 + 查询时间 + 报告时间
        const table1 = $('table table').eq(0).find('tr:nth-child(2)').find('.p')
        // 报告编号
        const report_number = table1.eq(0).html().split(":")[1];
        // 查询时间
        const query_time = table1.eq(1).html().split(":")[1];
        // 报告时间
        const report_time = table1.eq(2).html().split(":")[1];
        // 打印测试
        console.log(report_number,query_time,report_time)
    
        
        // 姓名 + 证件类型 + 证件号码 + 婚姻
        const table2 = $('table table').eq(1).find('tr').find('.p')
        // 姓名
        const report_name = table2.eq(0).html().split(":")[1];
        // 证件类型
        const report_type = table2.eq(1).html().split(":")[1];
        // 证件号码
        const report_id = table2.eq(2).html().split(":")[1];
        // 婚姻
        const report_marriage = table2.eq(3).html();
        // 打印测试
        console.log(report_name,report_type,report_id,report_marriage)
        
        // 表格
        let arr = []
        // Copy Selector
        const table3 = $('body > div > div > table > tbody > tr:nth-child(2) > td > table:nth-child(6) > tbody > tr:nth-child(3) > td > table > tbody > tr > td > table > tbody > tr')
        table3.each((i, el) => {
            let json = {}
            $(el).find('td').each((index, ele) => {
                json[index] = $(ele).text().trim()
            })
            arr.push(json);
        })
        console.log(arr)
    })

    爬虫2 + 代理服务器

    访问地址:http:localhost:8090?query=123

    知识点:get参数获取,header设置

    const http = require('http')
    const url = require('url')
    const util = require('util')
    const superagent = require('superagent')
    const cheerio = require('cheerio')
    
    
    const onRequest = (req,res) => {
        res.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8', 'Access-Control-Allow-Origin': '*'})
    /*
    let money = encodeURI(url.parse(req.url,true).query.money);
    let day = encodeURI(url.parse(req.url,true).query.day);
    */
        let keyWord = encodeURI(url.parse(req.url,true).query.query);   /* 最后一个query就是参数,在网页输入http://localhost:8090?query=123 就是了 */
    
    
    
        if(keyWord){
          superagent.get('http://weixin.sogou.com/weixin?type=1&query=' + keyWord + '&ie=utf8&_sug_=n&_sug_type_=').end(
              (err,response) => {
                if(err) console.log(err)
                let resultArr = []
                let $ = cheerio.load(response.text)
                $('.mt7 .wx-rb').each((index, item) => {
                  let resultObj = {
                    title: '',
                    wxNum: '',
                    link: '',
                    pic: ''
                  }
                  resultObj.title = $(item).find('h3').text()
                  resultObj.wxNum = $(item).find('label').text()
                  resultObj.link = $(item).find('href').text()
                  resultObj.pic = $(item).find('img').attr('src')
                  resultArr.push(resultObj)
                })
                res.write(JSON.stringify(resultArr))
                res.end()
            })
        }
    }
    
    http.createServer(onRequest).listen(process.env.PORT || 8090);
    console.log('Server Start!')

      

    推荐代理方法:

    神坑,注意 end 函数是异步的,所以res.end()也需要在回调中执行才正常

    /* 这个API有详情,稍后再做 */
    "use strict";
    const http = require('http');
    const url = require('url');
    const util = require('util');
    const superagent = require('superagent');
    const open = require("open");
    
    const appId = "2693ea802b98ae56d668a279e139c750";
    let result = "";
    let port = 8090;
    
    const onRequest = (req,res) => {
        res.writeHead(200,{'Content-Type':'text/plain;charset=utf-8','Access-Control-Allow-Origin':"*"})
        let qq = encodeURI(url.parse(req.url,true).query.qq);
        console.log("QQ",qq);
        if(req.url!=="/favicon.ico")
        {
            superagent.get(`http://japi.juhe.cn/qqevaluate/qq?qq=${qq}&key=${appId}`).end((err,response) => {
                    if(err) console.log(err);
                    console.log("response.text",response.text);
                    result = response.text; 
                    res.write(result);
                    result = "";
                    res.end();
            })
        }
    }
    
    
    http.createServer(onRequest).listen(port);  
    // open(`http://localhost:${port}?qq=928532756`);
    console.log("Server Start!");

      

    事件环机制 

    https://nodejs.org/dist/latest-v6.x/docs/api/events.html

    在Nodejs中,虽然不会拥有和客户端一样的“click”,"onmouseover"之类的用户交互事件,但存在一系列服务器应用程序中所可能触发的各种事件,例如,当一个用户向服务端发出一个客户端请求时,将触发http服务器在nodejs中被定义为“request”的事件。 

    事件监听,在浏览器中输入http://localhost:1337

    if(req.url !== "/favicon.ico") 为浏览器为页面在首场中的显示图标,通过该if屏蔽
    var http = require('http');
    var app = http.createServer();
    
    app.on('request',function(req,res){
        if(req.url !== "/favicon.ico"){
            console.log(req.url);
        }
        res.end();
    }).listen(1337,'127.0.0.1');

     事件绑定以及触发

    var http = require('http');
    var app = http.createServer();
    
    app.on('myevent',function(arg1,arg2,arg3){
        console.log(arg1,arg2,arg3);
    })
    
    app.emit('myevent',1,2,3);

    方法

    序号方法 & 描述
    1 addListener(event, listener)
    为指定事件添加一个监听器到监听器数组的尾部。
    2 on(event, listener)
    为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
    server.on('connection', function (stream) {
      console.log('someone connected!');
    });
    3 once(event, listener)
    为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
    server.once('connection', function (stream) {
      console.log('Ah, we have our first user!');
    });
    4 removeListener(event, listener)
    移除指定事件的某个监听器,监听器 必须是该事件已经注册过的监听器。
    var callback = function(stream) {
      console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback);
    5 removeAllListeners([event])
    移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
    6 setMaxListeners(n)
    默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。
    7 listeners(event)
    返回指定事件的监听器数组。
    8 emit(event, [arg1], [arg2], [...])
    按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。

    类方法

    序号方法 & 描述
    1 listenerCount(emitter, event)
    返回指定事件的监听器数量。

    事件

    序号事件 & 描述
    1 newListener
    • event - 字符串,事件名称

    • listener - 处理事件函数

    该事件在添加新监听器时被触发。

    2 removeListener
    • event - 字符串,事件名称

    • listener - 处理事件函数

    从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。

    nodejs模块化编程

    var _name,_age;
    var name = '',age=0;
    
    var foo = function(name,age){
        _name = name;
        _age = age;
    
        foo.prototype.getName = function(){
            return _name;
        }
    
        foo.prototype.setName = function(name){
             _name = name;
        }
    
        foo.prototype.getAge = function(){
            return _age;
        }
    
        foo.prototype.setAge = function(age){
             _age = age;
        }
    }
    
    foo.prototype.name = name;
    foo.prototype.age = age;
    
    foo.staticName = '';
    foo.staticFunction = function(){
        console.log(foo.staticName);
    }
    
    module.exports = foo;

     使用上面的模块

    var foo = require('foo');
    
    var myFoo = new foo('Lee',18);
    
    console.log("第一次获取",myFoo.getName(),myFoo.getAge());
    
    myFoo.setName("Mp");myFoo.setAge(19);
    
    console.log("修改私有变量后",myFoo.getName(),myFoo.getAge());
    
    myFoo.name = "shenyi";
    myFoo.age = 38;
    
    console.log("修改共有变量后",myFoo.getName(),myFoo.getAge(),"可以看出修改共有变量没有起作用");
    
    console.log("下面我们使用类的静态属性和静态方法");
    foo.staticName = "static Lee";
    foo.staticFunction();

    使用node_modules来管理模块

    //在项目根目录下进行以下操作
    mkdir node_modules
    
    //进入node_modules中,创建foo目录,然后进入创建index.js,将模块的代码放入其中。然后修改require('./test.js')的引用目录为require('foo');
    cd node_modules;
    mkdir foo;
    cd foo;
    touch index.js

    进阶管理

    //在foo文件夹中加入package.json,并加入以下代码:
    {
        "name":"foo",
        "main":"./lib/foo.js"
    }

    新建一个lib文件夹,并且将index.js放入其中,然后改名为foo.js

    NPM包管理工具 

    // 查看全局包的安装路径
    npm root -g
    
    // 修改全局包的安装路径
    npm config set prefix "d:
    ode"
    
    // 查看包的信息
    npm view <包名>
    
    // 查看当前目录下所有的包
    npm list
    
    // 查看安装路径下所有的包
    npm list -g
    
    // 卸载某个包
    npm uninstall <包名>
    
    // 卸载安装路径下的某个包
    npm uninstall -g <包名> 
    
    // 更新当前目录下所有包
    npm update
    
    // 更新安装目录下所有包
    npm update -g 
    
    // 更新当前目录下某个包
    npm update <包名>
    
    // 更新安装目录下某个包
    npm update -g <包名>

    文件操作系统

    https://nodejs.org/dist/latest-v6.x/docs/api/fs.html

    读取文件

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    var data = fs.readFileSync("./index.html",'utf8');  
    console.log("同步读取,等待操作返回结果",data);
    
    fs.readFile('./index.html','utf8',function(err,data){
        console.log("操作结果作为回调函数的第二个参数返回",data);
    })

     写入文件

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    fs.writeFile('./test.txt','第一行。
     第二行',function(err){
        if(err) console.error("文件写入失败");
        else console.log("文件写入成功");
    })

     追加数据

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    var option = {
        flag:"a"
    }
    
    fs.writeFile('./test.txt','这是追加的数据',option,function(err){
        if(err) console.error("文件写入失败");
        else console.log("文件写入成功");
    })
    
    /* 也可以使用appendFileSync */
    fs.appendFile('./test.txt','我又是追加的数据','utf8',function(err){
        if(err) console.error("文件写入失败");
        else console.log("文件写入成功");
    })

     文件的打开和读取

    同理有readSync

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    // data为打开文件时返回的文件描述符,在window中称为文件句柄
    fs.open('./test.txt','r',function(err,data){
        var buf = new Buffer(255);
        // 从第0个开始到第9个字符,截取3个字符串
        fs.read(data,buf,0,9,3,function(err,bytesRead,buffer){
            console.log(buffer.slice(0,bytesRead).toString());
    
            //从上一次读取的位置继续往下读
            fs.read(data,buf,0,3,null,function(err,bytesRead,buffer){
                console.log(buffer.slice(0,bytesRead).toString());
            })
        })
    
    })

    文件的打开和写入、追加

    同理有writeSync

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    var buf = new Buffer('我喜爱编程');
    
    // w 会清空文件的内容
    fs.open('./test.txt','w',function(err,data){
        fs.write(data,buf,3,9,0,function(err,written,buffer){
            if(err) console.log('写入文件失败');
            console.log('写入文件成功');
        })
    })// a 追加文件内容
    fs.open('./test.txt','a',function(err,data){
        fs.write(data,buf,3,9,0,function(err,written,buffer){
            if(err) console.log('写入文件失败');
            console.log('写入文件成功');
        })
    })

    close方法 / closeSync方法 

    当对文件的读写操作执行完毕后,我们通常需要关闭该文件。尤其是在文件以排他方式被打开时

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    var buf = new Buffer('我喜爱编程');
    
    // w 会清空文件的内容
    fs.open('./test.txt','a',function(err,data){
        fs.write(data,buf,0,15,0,function(err,written,buffer){
            if(err) console.log('写入文件失败');
            console.log('写入文件成功');
            fs.close(data);
        })
    })

    fsync 方法确保文件全部写入

     在使用write/writeSync 方法在文件中写入数据时,操作系统的做法是首先将该部分数据读到内存中,再把数据写到文件中,这时如果你使用close/closeSync方法关闭文件时,就会造成数据流失。正确的姿势是使用fync方法来对文件进行同步操作。即把内存中缓冲区中的剩余数据全部写入文件中。写法如下

     fs.fync(fd,[callback]) / fs.fyncSync(fd)

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    var buf = new Buffer('我喜爱编程');
    
    // w 会清空文件的内容
    fs.open('./test.txt','a',function(err,data){
        fs.write(data,buf,0,15,0,function(err,written,buffer){
            if(err) console.log('写入文件失败');
            console.log('写入文件成功');
            fs.fsync(data);
            fs.close(data);
        })
    })

    mkdir创建文件目录

    同理mkdirSync

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    fs.mkdir('./test',function(err){
        if(err) console.log('create失败');
        else console.log('create成功');
    })

    readdir读取文件目录列表

    同理readdirSync

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    fs.readdir('./test',function(err,files){
        if(err) console.log('失败');
        else console.log(files);
    })

    stat/lstat查看目录信息,两者的区别是,当查看符号链接文件的信息时,必须使用后者

    同理statSync / lstatSync 

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    fs.stat('./test',function(err,stats){
        console.log(stats);
    });

    exists 检查文件或者目录是否存在

    同理existsSync

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    fs.exists('./test',function(exists){
        if(exists) console.log('该文件存在');
        else console.log('该文件不存在');
    });

    realpath获取文件或者目录的绝对路径

    同理realpathSync

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    fs.realpath('./test',function(err,path){
        if(err) console.log("err");
        else console.log(path);
    })

    utimes修改文件访问事件及修改时间

    同理utimesSync

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    fs.utimes('./test',new Date(),new Date(),function(err){
        if(err) console.log("err");
        console.log("修改文件时间操作成功");
    }) 

    chmod修改文件或者目录的读写权限

    同理chmodSync

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    // 0600 表示所有者可读写,其他人没有权限
    fs.chmod('./test',0600,function(err){
         if(err) console.log("err");
         console.log("0600 表示所有者可读写,其他人没有权限");
    })
    
    // 0644 表示所有者可读写,其他人只读
    fs.chmod('./test',0644,function(err){
         if(err) console.log("err");
         console.log("0644 表示所有者可读写,其他人只读");
    })
    
    // 0755 表示所有者有所有权限,其他人可读和执行
    fs.chmod('./test',0755,function(err){
         if(err) console.log("err");
         console.log(" 0755 表示所有者有所有权限,其他人可读和执行");
    })
    
    // 0740 表示所有者有所有权限,所有者所在的组只读
    fs.chmod('./test',0740,function(err){
         if(err) console.log("err");
         console.log("0740 表示所有者有所有权限,所有者所在的组只读");
    })

     

    rename 移动文件或者目录、重命名

    同理renameSync

    /* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
    var fs = require('fs');
    
    var files = fs.rename('./test.txt','./test/test.txt',function(err){
         if(err) console.log("err");
         console.log("文件操作成功");
    })

    删除文件夹

    // 删除文件夹
    function deleteall(path) {  
        var files = [];  
        if(fs.existsSync(path)) {  
            files = fs.readdirSync(path);  
            files.forEach(function(file, index) {  
                var curPath = path + "/" + file;  
                if(fs.statSync(curPath).isDirectory()) { // recurse  
                    deleteall(curPath);  
                } else { // delete file  
                    fs.unlinkSync(curPath);  
                }  
            });  
            fs.rmdirSync(path);  
        }  
    };  

    socket.io

    安装socket

    npm install socket.io --save  

    我的demo(express版本):

    "use strict";
    const express = require('express');
    const fs = require('fs');
    const sio = require('socket.io');
    
    let app = express();
    app.get(
    '',function(req,res){ res.end(fs.readFileSync('./index.html','utf8')); })
    var server = app.listen(port, function () { console.log("Server Start!"); })
    let socket
    = sio.listen(server);
    // 注意其他事件的绑定必须在connection的回调中 socket.on('connection',function(socket){
    console.log(
    "socket start!");
    socket.send(
    "hello world");
    socket.on(
    "message",function(msg){ console.log(msg); socket.send("server message send test"); })
    socket.on(
    'disconnect',function(){ console.log("the client is over"); })

        socket.on("myevent",function(data){
          console.log("the server is get client myevent:",data);
        })

    
    

        socket.emit('news',{newid:"123"});

    })

     再准备一个index.html

    <!DOCTYPE html>
    <html>
      <head>
          <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black">
        <meta charset="utf-8">
        <title>weicantimes</title>
        <script type="text/javascript" src="/socket.io/socket.io.js"></script>
      </head>
      <body>
        <div id="app">
            <router-view  keep-alive></router-view>
        </div>
      </body>
      <script type="text/javascript">
        console.log("index.html");
        var socket = io.connect();
        socket.on('message',function(msg){
          console.log(msg);
          // socket.send('client send message test');
        })
        socket.on('disconnect',function(){
          console.log('server over');
        })
    
        socket.emit("myevent",{name:"Lee"});
        
        socket.on("news",function(data){
          console.log("news:",data);
        })
      </script>
    </html>

     如果是在VueJs中使用,则需要第三方模块:Vue-Socket.io

    https://github.com/MetinSeylan/Vue-Socket.io

    我的demo:

    import VueSocketio from 'vue-socket.io';
    Vue.use(VueSocketio, 'http://localhost:8090');

    sockets : { connect : function(){ console.log('socket connected') }, client_menu : function(data){ console.log("client_menu",data) } } created () { this.$socket.emit("server_menu",{name:"test"}); }

    人机交互

    function readSyncByfs(tips) {
        tips = tips || '> ';
        process.stdout.write(tips);
        process.stdin.pause();
    
        const buf = Buffer.allocUnsafe(10000);
        let response = fs.readSync(process.stdin.fd, buf, 0, 10000, 0);
        process.stdin.end();
    
        return buf.toString('utf8', 0, response).trim();
    }
    
    
    var a = readSyncByfs('请输入任意字符:');
    var a = readSyncByfs('');
    console.log(a);

  • 相关阅读:
    Composer autoload 自动加载
    权限问题
    加载适配器和布局之间的顺序关系--Unsolved
    listview和button
    线程练习中出现的错误
    线程02
    关于初始化成员变量
    可扩展列表
    Android开发中Handler的经典总结----转载
    线程01
  • 原文地址:https://www.cnblogs.com/CyLee/p/5324984.html
Copyright © 2011-2022 走看看