• net模块


    http://www.cnblogs.com/tzyy/p/5124256.html#_h1_0

    https://segmentfault.com/a/1190000007507322

    Net模块可用于创建Socket服务器或Socket客户端。 

    NodeJS 的数据通信,最基础的两个模块是 Net 和 Http,前者是基于 Tcp 的封装,后者本质还是 Tcp 层,只不过做了比较多的数据封装,我们视为表现层(在http模块概览里提到,http.Server继承了net.Server)

    回顾下:

    (1),TCP/IP------TPC/IP协议是传输层协议,主要解决数据如何在网络中传输。

    (2),Socket------socket则是对TCP/IP协议的封装和应用(程序层面)。

    (3),Http------HTTP是应用层协议,主要解决如何包装数据。

    (4),网络七层模型------物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

    总结一下:Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。

    从而形成了我们知道的一些最基本的函数接口,比如Create、Listen、Connect、Accept、Send、Read和Write等等。

    TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口

    实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。

    建立server.js

    var net = require('net') ;
    var server = net.createServer(function(c) { // Connection监听器
      console.log("服务器已连接") ;
      c.on("end", function() {
        console.log("服务器已断开") ;
      }) ;
      c.write("Hello,Bigbear !
    ") ;
      c.pipe(c) ;
    }) ;
    server.listen(8124, function() { // Listening监听器
      console.log("服务器已绑定") ;
    }) ;

    建立client.js

    var net = require('net') ;
    var client = net.connect({
        port: 8124
    },function(){ // connect监听器
      console.log("客户端已连接") ;
      client.write('Hello,Baby !
    ') ;
    });
    client.on("data", function(data) {
      console.log(data.toString()) ;
      client.end() ;
    });
    client.on("end", function(){
      console.log("客户端断开连接") ;
    }) ;
    

    搭建聊天室的基础

    // 在前者的基础上,实现 Client --> Sever 的通讯,如此一来便是双向通讯
    var net = require('net');
    var chatServer = net.createServer(),    
        clientList = [];
        
    chatServer.on('connection', function(client) {
      // JS 可以为对象自由添加属性。这里我们添加一个 name 的自定义属性,用于表示哪个客户端(客户端的地址+端口为依据)
      client.name = client.remoteAddress + ':' + client.remotePort;  
      client.write('Hi ' + client.name + '!
    ');  
      clientList.push(client);  
      client.on('data', function(data) {    
         broadcast(data, client);// 接受来自客户端的信息  
      });
    });
    
    function broadcast(message, client) {
      var cleanup = []
      for(var i=0;i<clientList.length;i+=1) {
        if(client !== clientList[i]) {
    
          if(clientList[i].writable) { // 先检查 sockets 是否可写
            clientList[i].write(client.name + " says " + message)
          } else {
            cleanup.push(clientList[i]) // 如果不可写,收集起来销毁。销毁之前要 Socket.destroy() 用 API 的方法销毁。
            clientList[i].destroy()
          }
    
        }
      }  //Remove dead Nodes out of write loop to avoid trashing loop index 
      for(i=0;i<cleanup.length;i+=1) {
        clientList.splice(clientList.indexOf(cleanup[i]), 1)
      }
    }
    

      

  • 相关阅读:
    Mac下Android studio搭建Android开发环境【新手】
    2016年美国数学建模比赛(MCM/ICM) E题环境科学 Are we heading towards a thirsty planet? 人工精准翻译。
    一张图让你快速学会UML(聚合、组合、依赖、继承、接口、类)
    《黑客与画家》——读书笔记
    YC(Y Combinator)斯坦福大学《如何创业》课程要点记录(粗糙)
    《你的灯亮着吗?发现问题的真正所在》——读书笔记
    sublime使用
    spring AOP面向切面编程
    LinkedHashMap源码浅析jdk1.7
    增强型for循环与集合
  • 原文地址:https://www.cnblogs.com/luguiqing/p/7724185.html
Copyright © 2020-2023  润新知