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) } }